簡體   English   中英

為 std::optional 對象的 std::array 賦值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM