2014-07-04 40 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)) {}