2012-11-14 42 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 
} 
相关问题