2014-07-04 38 views
1

我试着从类构造函数中调用结构的构造函数,但是它抛出一个错误。我一直在试图解决这个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个参数。我不知道问题出在哪里。

谢谢。

+0

你需要一个默认的构造函数。 同样的问题[这里] [1] [1]:http://stackoverflow.com/questions/19743115/c-struct-constructor – Matthias

回答

5
node list[1000]; 

是一个结构数组。作为数组元素的结构需要一个默认构造函数(或者必须明确指定初始值,see example),从而产生错误。将一个默认构造函数添加到node


C++标准n3337 § 12.6.1/3

[注意:如果T是一个类的类型没有默认的构造,任何 声明类型T的对象的(或阵列)如果 没有明确指定初始值(见12.6和8.5),那么它是不合格的。 - 注完 ]

+0

或更好,但使用的std ::矢量 – PlasmaHH

+0

可选:使用初始化程序数组。 – Deduplicator

+0

或完全移除阵列。它甚至在那里做什么?为树提供预分配的节点?那么为什么在构造函数中动态地分配一个节点呢? –

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)) {}