2016-02-18 64 views
0

我學習了一下C++的,從Java來了...爲什麼我需要一個默認構造函數,如果我從不明確調用它?

我寫了幾類,VectorBezier(三次貝塞爾曲線(有分量x,Y,Z三維向量)的基礎在4個輸入向量上)。

Vector工作正常,沒有定義默認的構造函數。

Bezier給了我一個編譯錯誤:

Bezier.h

class Bezier 
{ 
    public: 
    Vector p1; 
    Vector cp1; 
    Vector cp2; 
    Vector p2; 
    Bezier(const Vector &p1, const Vector &cp1, const Vector &cp2, const Vector &p2); 
}; 

Bezier.cpp

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_) 
{ 
    p1 = p1_; 
    cp1 = cp1_; 
    cp2 = cp2_; 
    p2 = p2_; 
} 

錯誤:

In constructor 'Bezier::Bezier(const Vector&, const Vector&, const Vector&, const Vector&)': error: no matching function for call to 'Vector::Vector()'

看來編譯器希望我創建一個默認的構造函數Vector(),雖然我不需要它。我錯過了什麼明顯的東西?

+2

你錯過了初始化列表。而「如果我從不明確地稱呼它」的答案?是你在*隱式地*調用它。 – meagar

+0

你爲什麼認爲你不需要它? – immibis

回答

5

您的代碼(因爲它是現在)需要默認的向量構造函數。

看再次驗證碼:

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_) 
{ 
    p1 = p1_; 
    cp1 = cp1_; 
    cp2 = cp2_; 
    p2 = p2_; 
} 

它所做的是,它默認,構建所有4個載體和然後值分配給他們

如果你想擺脫默認的建設步驟,建設這些向量與參數的構造函數,你可以這樣寫:

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_) 
    : p1(p1_), cp1(cp1_), cp2(cp2_), p2(p2_) 
{} 
8

當你輸入構造函數時,你還沒有初始化你的成員變量。因此,您的代碼嘗試調用p1,cp1等的默認構造函數,以便在根據p1 = p1_; ...覆蓋該定義之前對它們進行初始化。要告訴您的代碼根本不調用默認構造函數,請使用Bezier::Bezier(...) : p1(p1_), cp1(cp1_), ... {}。這繞過了默認構造函數的需要,而是立即通過複製構造函數初始化所有Vector實例。

相關問題