0

構造体のオプションのメンバーを割り当てるための最良のスタイルは何ですか? たとえば、私は構造体を持っています:

struct B{
public:
    int x;
}


struct A{
public:
    boost::optional<B> b;
};


void foo(){
   A a;
   a.b.x = 10; //Runtime exception because a.b is not initialized. 
}

1 つのオプションは、一時的な B 構造体を定義し、それを A に割り当てることです。

void foo(){
    A a;
    B tmp;
    a.b = tmp;
    a.b.x = 10; //OK. 
}

また:

void foo(){
    A a;
    a.b = B();
    a.b.x = 10; //OK. 
}

これを行うためのより明確な方法はありますか?

4

1 に答える 1

5

使用する前に初期化するしかありません。そうしないと、終了の原因となるアサーションの失敗が発生します。

しかし、それを初期化する方法について尋ねているなら、それらはたくさんあります:

  1. a.b = B{10}PODタイプなので
  2. a.b = B()すでに行ったように(PODタイプだけでなく、常に機能します)。
  3. コンストラクタを作成し、 のようにしa.b = B(10)ます。それでも、常にオブジェクトを作成して割り当てる必要があります。したがって、オブジェクトの暗黙的または明示的な作成を行うことができますが、それを行う必要があります。
  4. @ nm が語ったように、boost 1.56ではemplace()、同じことを行うメソッドを次に示しますa.b.emplace()
于 2015-07-20T09:53:53.170 に答える