13

这可能是一个愚蠢的问题,但我在网上找不到很多关于在 C++ 中创建自己的默认构造函数的信息。它似乎只是一个没有参数的构造函数。但是,我尝试像这样创建我的默认构造函数:

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

我也试过了:

Tree::Tree() {}

当我尝试其中任何一个时,我都会收到错误消息:

没有重载函数“Tree::Tree”的实例与指定的类型匹配。

我似乎无法弄清楚这意味着什么。

我正在我的.cpp文件中创建这个构造函数。我也应该在我的头.h文件()中做些什么吗?

4

4 回答 4

16

成员函数(包括构造函数和析构函数)必须在类定义中声明:

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

};

然后你可以在你的 .cpp 文件中定义它:

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

我投入了nullptrfor C++11。如果您没有 C++11,请使用root(0).

于 2012-11-14T19:35:15.567 回答
9

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
}
于 2017-03-24T08:37:52.503 回答
5

为任何成员函数创建定义是不够的。您还需要声明成员函数。这也适用于构造函数:

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

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

作为旁注,您应该使用成员初始化器列表,并且不应该使用NULL. 在 C++ 2011 中,您想使用nullptr后者,在 C++ 2003 中使用0.

于 2012-11-14T19:35:18.390 回答
4

是的,您需要在标题中声明它。例如,将以下内容放在树类的声明中。

class Tree {
    // other stuff...
    Tree();
    // other stuff...
};
于 2012-11-14T19:33:12.130 回答