2012-11-14 43 views
4

這可能是一個愚蠢的問題,但我無法在網上找到很多關於在C++中創建自己的默認構造函數的信息。它似乎只是一個沒有參數的構造函數。不過,我試圖創建我的默認構造函數是這樣的:在C++中創建一個默認構造函數

Tree::Tree() {root = NULL;} 

我也嘗試了:

Tree::Tree() {} 

當我嘗試上述任一我收到錯誤:

No instance of overloaded function "Tree::Tree" matches the specified type.

我似乎無法弄清楚這意味着什麼。

我在我的.cpp文件中創建此構造函數。我是否應該在頭文件(.h)文件中做一些事情?

回答

3

是的,你需要在你的頭部聲明它。例如,在樹類的聲明中放置以下內容。

class Tree { 
    // other stuff... 
    Tree(); 
    // other stuff... 
}; 
+0

謝謝!我知道這是這樣的。我想我需要學習一些關於頭文件的知識。 – user1824239

+0

歡迎您! –

11

成員函數(包括構造函數和析構函數)在類定義中聲明:

class Tree { 
public: 
    Tree(); // default constructor 
private: 
    Node *root; 

}; 

然後你就可以在你的.cpp文件中定義它:

Tree::Tree() : root(nullptr) { 
} 

我爲C++ 11投入了nullptr。如果您沒有C++ 11,請使用root(0)

+2

只是'root()'似乎是最明智的... –

+0

謝謝!我之前讀過類定義,但不知道這是什麼意思,所以我可能忽略了它。現在它更有意義。 – user1824239

+0

每個班級都必須有一個定義。該定義列出了該類的成員函數和成員數據。無論您在何處使用該類,您的代碼都必須查看類定義。所以類定義幾乎總是進入一個頭文件,你可以在任何使用該類的源文件中包含#include。在定義成員函數的源文件中,還包含頭文件,然後編寫函數定義。 –

3

僅爲任何成員函數創建定義是不夠的。您還需要聲明的成員函數。這也適用於構造函數:

class Tree { 
public: 
    Tree(); // declaration 
    ... 
}; 

Tree::Tree() // definition 
    : root(0) { 
} 

作爲一個側面說明,你應該使用成員初始化列表,你應該使用NULL。在C++ 2011中,您希望爲後者使用nullptr,在C++ 2003中使用0

+0

謝謝!這是我在想什麼,但不知道如何申報。 – user1824239

2

C++ 11允許你這樣定義自己的默認構造函數:

class A { 
    public: 
     A(int);  // Own constructor 
     A() = default; // C++11 default constructor creation 
}; 

A::A(int){} 

int main(){ 
    A a1(1); // Okay since you implemented a specific constructor 
    A a2(); // Also okay as a default constructor has been created 
} 
相關問題