[英]Assigning values to std::array of std::optional objects
我正在嘗試填充 std::array 的 std::optional 對象,如下所示。
class MyClass
{
private:
int distance;
MyClass(int x, int y);
friend class MasterClass;
};
MyClass::MyClass(int x, int y)
{
distance = x+y;
}
class MasterClass
{
public:
MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys);
private:
std::array<std::optional<MyClass>, 5> myclassarray{};
};
MasterClass::MasterClass(std::array<std::optional<int>,5> xs, std::array<std::optional<int>,5> ys)
{
for(int i=0; i<5;i++)
{
myclassarray[i].emplace(new MyClass(*xs[i], *ys[i])); //---(1)
}
}
從上面用 (1) 注釋的行中,我收到以下錯誤,
error: no matching function for call to std::optional<MyClass>::emplace(MyClass&)
我也嘗試用
myclassarray[i] = new MyClass(*xs[i], *ys[i]) ; //---(2)
這會給我
error: no match for ‘operator=’ (operand types are ‘std::array<std::optional<MyClass>,5>::value_type’ {aka ‘std::optional<MyClass>’} and ‘MyClass*’)
我該如何解決這個問題?
看起來您可能來自 Java 或 C#。 在 c++ 中賦值時,很少會使用new
。 問題是,你基本上是這樣做的:
std::optional<MyClass> o = new MyClass();
o 是std::optional<MyClass>
類型,而new My Class()
是MyClass *
類型。 從 這里可以看出,沒有任何操作將指向 object 的指針轉換為 object 的可選項。 讓我們回到基礎,我們想要做的是:
std::optional<int> o; // defaults to std::nullopt
o = value; // We set it with some value.
實際上,這就是它的全部。 所以讓我們擴展為一個數組:
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.
這很容易擴展到您的示例:
for(int i=0; i<5;i++) {
myclassarray[i] = MyClass(*xs[i], *ys[i]));
}
請注意這一點:
*xs[i], *ys[i]
因為從這里開始:
如果 *this 不包含值,則行為未定義。
如果是這樣的話,這會讓你很傷心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.