2017-01-27 56 views
0

我有一個抽象類A和類B與構造:如何在另一個構造函數中調用對象構造函數?

B(A &a) {...} 

現在,我創建在主程序這些對象如下:

int main(){ 
    std::unique_ptr<A> a = make_A();//don't mind make_A() 
    if(a==null) 
    a = make_default_A(); 
    B b (*a); 
} 

現在,我創建了一個類的設置系統:

class System{ 
public: 
    System(); 
private: 
    B b; 
    std::unique_ptr<A> a; 
} 

而且構造函數是:

System(){ 
    a = make_A(); 
    if(a==null) 
    a = make_default_A(); 
    b(*a); 
} 

顯然這是錯誤的,因爲我不能在上面的代碼中調用B的構造函數,但是我不知道如何執行此操作。我想到的唯一解決方案是使用std::unique_ptr<B> b;而不是B b;,然後撥打b = make<B> (*a);

+0

'B = B(*一);'應該重新初始化'B'(請注意,它的第一個初始化發生在進入構造函數之前) – AndyG

+0

或者,也許你可以去用於重載'='運算符並執行相同的操作 –

+0

@AndyG - * initialize *在C++中有一個非常具體的含義,而'b = B(* a);'不*初始化'b' - 它賦值給它。 –

回答

1

它應該是:

class System{ 
public: 
    System() : a(make_A()), b(*a) {} // use initializer list for constructor 
private: 
    // Fix order of members to initialize in correct order. 
    std::unique_ptr<A> a; 
    B b; 
}; 
+0

我編輯了這個問題,請看看它。 – justHelloWorld

+0

創建一個函數'MakeAOrDefault'。 – Jarod42

+0

大聲笑是有道理的 – justHelloWorld

相關問題