2014-02-24 73 views
1

我是C++的新手。我想聲明一個對象作爲另一個類的私有成員。該對象的實例化是否可以使用默認構造函數完成?樣本代碼這裏列出:將對象實例化爲沒有默認構造函數的類成員

class Vertex{ 
    int i; 
public: 
    Vertex(int j):i(j){}; 
    Vertex(const Vertex & v){i=v.i;}; 
} 

class Test{ 
    Vertex v; 
public: 
    Test(const Vertex & v1){v(v1);} 
} 

int main() 
{//some code here; 
    Vertex v1(int j=1); 
    Test(v1); // *error: no matching function for call to 'Vertex::Vertex()'* 
    return 0; 
} 

在我看來,一旦宣佈一個對象作爲私有類成員(例如頂點v),默認的構造函數立即追捧。無論如何要避免這一點?非常感謝。

回答

3
Vertex v1(int j=1); 

聲明一個功能v1,它返回一個Vertex和接受一個int參數。你想要的是

Vertex v1(1); 
除了

,你需要初始化器列表使用作爲其他的答案顯示:

Test(const Vertex & v1) : v(v1) {} 
+0

感謝您的回答。但是如果Test類還包含一個矢量容器,並且在構建一個Test對象期間需要將對象v1推入容器? – Void

1

使用構造函數初始化列表:

Test(const Vertex & v1) : v(v1) {} 

一旦你在構造函數的主體({}之間),所有數據成員已經被初始化。如果你沒有明確地做,它們會得到默認的初始化,這需要一個可用的用戶定義類型的默認構造函數。

接下來,你在這裏聲明一個函數:

Vertex v1(int j=1); 

什麼你可能是指是

Vertex v1(1); 
+1

那麼,有沒有一個單一的東西不對的答案?我想知道,如果有投票的理由,我會解決它。 – juanchopanza

+0

謝謝,我喜歡初始化列表方法。但是如果Test類擁有多個私有成員,例如構造函數需要Test(A a,B b,C c ...,Vertex v1),初始化可能不是最佳選擇。 – Void

+0

@ user3348650它通常是最好的選擇,而在C++ 03中,它是使用用戶提供的構造函數初始化數據成員的唯一方法。 C++ 11使您可以在聲明的位置委託構造函數和初始化,這使得這種事情不那麼冗長。 – juanchopanza

1

初始化Test::v就像你初始化Vertex::i。 (這是private完全無關!)

因此,使用Test::Test的成員初始化列表:

Test(const Vertex & v1) : v(v1) {}; 

爲了保持一致性,那麼,我也建議:

Vertex(const Vertex & v) : i(v.i) {}; 

儘可能初始化會員。

相關問題