调用构造函数时出错

时间:2014-07-04 12:14:25

标签: c++ class struct constructor

我试图从类构造函数中调用结构的构造函数,但它抛出了一个错误。我一直试图解决这个问题30分钟

结构:

struct node
{
    int val;
    node* left;
    node* right;
    node(int x)
    {
        val = x;
        left = NULL;
        right = NULL;
    }

    ~node()
    {
        delete(left);
        delete(right);
    }
};

类:

class Tree
{
    node* head;
    node list[1000];
    bool flag[1000] = {0};
public:
    Tree(int x)
    {
        head = new node(x);
    }

main()方法:

int main()
{
    int a[] = {50,35,75,20,45,60,90,10,25,40,47,65,80,120,1,15,23,30,39,
46,49,82,110,21,24,48};
    Tree t(a[0]);

我得到的错误是

错误日志:

In constructor 'Tree::Tree(int)':|
|37|error: no matching function for call to 'node::node()'|
|37|note: candidates are:|
|17|note: node::node(int)|
|17|note:   candidate expects 1 argument, 0 provided|
|12|note: node::node(const node&)|
|12|note:   candidate expects 1 argument, 0 provided|

结构构造函数有一个参数,在类构造函数中我用一个参数调用但错误是抛出程序调用0参数。我不知道问题出在哪里。

感谢。

2 个答案:

答案 0 :(得分:5)

node list[1000];

是一组结构。作为数组元素的结构需要一个默认构造函数(或必须显式指定初始化程序,see example),因此错误。将默认构造函数添加到node


C ++标准版n3337 § 12.6.1 / 3

  

[注意:如果T是一个没有默认构造函数的类类型,那么任何   如果是,T型(或其数组)对象的声明是不正确的   没有明确指定初始化器(见12.6和8.5)。 - 结束说明   ]

答案 1 :(得分:1)

Tree类包含节点:

node list[1000];

需要默认初始化。但是没有默认的构造函数来做。

假设您实际上希望将一千个节点与构成树的节点分开,您可以通过为其提供默认参数,使现有构造函数可用作默认构造函数:

node(int x = 0)

或添加单独的默认构造函数,例如:

node() : val(0), left(0), right(0) {}

或者您可以通过使用更友好的容器替换数组来避免使用默认构造函数

std::vector<node> list;

并将其初始化为构造函数中所需的大小:

Tree(int x) : head(new node(x)), list(1000, node(0)) {}