2015-07-20 41 views
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. 
} 

一種選擇是定義臨時乙結構,並將其分配給答:

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. 
} 

是否有更明確的方式去做這個?

+0

你的情況:'a.b = B {10};' –

+0

@ m.s。並且在B更復雜的情況下? – Sanich

+0

你的第一個例子不是臨時的。 –

回答

5

您別無選擇,只能在使用它之前進行初始化。如果你不這樣做,你會有一個斷言失敗,這將導致終止。

但如果你問的方式對其進行初始化,也有很多人:

  1. a.b = B{10},因爲它是POD類型。
  2. a.b = B()正如你所做的那樣(始終工作,不僅僅是POD類型)。
  3. 創建一個構造函數並使其像a.b = B(10)。但是,仍然需要創建一個對象並分配給它。所以,你可以做隱式或顯式的對象創建,但是你必須這樣做。
  4. boost 1.56中,正如@n.m告訴的,這是一個emplace()方法,它對您也是如此:a.b.emplace()