为 std::可选对象的 std::array 赋值

Tee*_*les 1 c++ stdarray c++17 stdoptional

我正在尝试填充 std::array 的 std::Optional 对象,如下所示。

\n
class MyClass\n{\n   private:\n    int distance;\n    MyClass(int x, int y);\n\n   friend class MasterClass;\n};\n\nMyClass::MyClass(int x, int y)\n{\n  distance = x+y;\n}\n\nclass MasterClass\n{\n  public:\n  MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys);\n  \n  private:\n  std::array<std::optional<MyClass>, 5> myclassarray{};\n\n};\n\nMasterClass::MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys)\n {\n     for(int i=0; i<5;i++)\n     {\n         myclassarray[i].emplace(new  MyClass(*xs[i], *ys[i])); //---(1)\n     }\n\n }\n
Run Code Online (Sandbox Code Playgroud)\n

从上面用 (1) 注释的行中,我收到以下错误,

\n
error: no matching function for call to std::optional<MyClass>::emplace(MyClass&)\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试用以下内容替换同一行

\n
 myclassarray[i] = new  MyClass(*xs[i], *ys[i]) ; //---(2)\n
Run Code Online (Sandbox Code Playgroud)\n

这会给我

\n
error: no match for \xe2\x80\x98operator=\xe2\x80\x99 (operand types are \xe2\x80\x98std::array<std::optional<MyClass>,5>::value_type\xe2\x80\x99 {aka \xe2\x80\x98std::optional<MyClass>\xe2\x80\x99} and \xe2\x80\x98MyClass*\xe2\x80\x99)\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何解决这个问题?

\n

Fan*_*Fox 7

看来您可能来自 Java 或 C#。在 C++ 中赋值时,很少会使用new. 问题是,你基本上是这样做的:

std::optional<MyClass> o = new MyClass();
Run Code Online (Sandbox Code Playgroud)

o 的类型为 ,std::optional<MyClass>并且new My Class()的类型为MyClass *从这里可以看到,没有任何操作将对象的指针转换为对象的可选值。让我们回到基础,我们想做的是:

std::optional<int> o; // defaults to std::nullopt
o = value; // We set it with some value.
Run Code Online (Sandbox Code Playgroud)

实际上这就是全部内容了。所以让我们扩展到一个数组:

std::array<std::optional<int>, 5> a; // An array with 5 optional, all are std::nullopt
a[2] = value; // Set the optional at position 2 to a value.
Run Code Online (Sandbox Code Playgroud)

这很容易扩展到您的示例:

for(int i=0; i<5;i++) {
     myclassarray[i] = MyClass(*xs[i], *ys[i]));
}
Run Code Online (Sandbox Code Playgroud)

请小心这一点:

*xs[i], *ys[i]
Run Code Online (Sandbox Code Playgroud)

因为从这里开始:

如果 *this 不包含值,则行为未定义。

如果是这种情况,这会给你带来很大的悲伤。

  • 同意!我只是认为值得一提的是使用 `emplace` 的正确方法,因为 OP 就是从它开始的 (2认同)