2012-12-10 149 views
0

我使用下面的類聲明:參考在構造函數的參數調用參考的默認構造函數

class A { 
public: 
    A(int, float); 
    A(const A&); 
}; 

class B { 
public: 
    B(A&); 
protected: 
    A a; 
}; 

我還設置瞭如下定義爲B:

B::B(A &a) { 
    this->a = a; 
} 

的問題是我有一個錯誤關於我的B構造函數的定義,告訴我有No matching function for call to A::A()

爲什麼我的B構造函數試圖創建一個新的A?

如果需要上一步,爲什麼不使用引用調用複製構造函數?

+1

「B」是從「A」派生的還是包含「A」的實例? – NPE

+2

您發佈的代碼不會嘗試在'B'構造函數中默認構造'A',並且不會生成此錯誤。請發佈真實的代碼。您發佈的代碼是假的。 – AnT

+0

這不是一個測試用例。它不會重現問題。 http://sscce.org –

回答

3

我假設你的B有一個A需要構建。在你當前的構造函數中,你沒有明確地指定要使用的A構造函數。因此它會嘗試默認構造函數A,它不存在:

也許你打算構建B的A與參考?

class B { 
private: 
    A _a; 
public: 
    B(A& a) : _a(a) {} 

}; 
+0

哦,你是對的,我沒有看正確的地方... 我確實有一個成員類型A需要初始化。 我的構造函數都是公開的。我只是省略了添加標記的工作,現在已經完成了我的第一篇文章。 –

+0

令人困惑的是,我有一個包含在B中的A對象的定義。它沒有在構造函數定義行中設置,而是在它的主體中設置。我將成員定義從'this-> a = a'改爲'B :: B(A&a):a(a)',現在它可以工作......這可能是因爲編譯器試圖在填充之前構建對象它現在它在同一時間完成第二步。胡亂猜測 –