2014-03-03 63 views
0

這裏是我的代碼:如何調用類是在C++中另一個類中的構造函數?

template<class Datatype> 
class Node 
{ 
    public: 
     Node() 
     { 
      next = NULL; 
      prev = NULL; 
     } 
     Node* getNext() 
     { 
      return next; 
     } 
     Node* getPrev() 
     { 
      return prev; 
     } 
     Datatype* getData() 
     { 
      return &data; 
     } 
     void changeNext() 
     { 
      next = NULL; 
     } 
     void changeNext(Node& nextNode) 
     { 
      next = &nextNode; 
     } 
     void changePrev() 
     { 
      prev = NULL; 
     } 
     void changePrev(Node& prevNode) 
     { 
      prev = &prevNode; 
     } 
     Node* addNext(Node &); 
     Node* addPrev(Node &); 
     void nodeDel(); 
     void addData(Datatype &); 
    private: 
     Node* next; 
     Node* prev; 
     Datatype data; 
}; 

template<class Datatype> 
class Stack 
{ 
    public: 
     Stack() 
     { 
      node.Node(); 
     } 
     int push(Datatype &); 
     Datatype pop(); 
     Datatype* peek(); 
    private: 
     Node<Datatype> node; 
}; 

的編譯錯誤是這樣的:

my_node.h: In constructor ‘Stack<Datatype>::Stack() [with Datatype = float]’: 
test.cpp:8:15: instantiated from here 
my_node.h:58:4: error: invalid use of ‘Node<float>::Node’ 

在開始時,我沒有寫的構造函數棧。但是,我覺得實際上由我定義的節點的構造函數沒有被調用,因爲next和prev指針中有一些值。所以我試着寫一個Stack的構造函數,它明確地調用Node的構造函數。不幸的是,上面顯示的編譯錯誤出現了。我想知道如何調用另一個類中的類的構造函數。

感謝, 凱文周

回答

2

如果你沒有做任何事情,對於node成員的默認構造函數將被調用。

如果您要明確構建一個成員,你做它的構造initializer list

Stack() 
    : node() 
{} 

由於默認的構造函數總會被調用,明確結構構件,如果你需要傳遞參數給時纔有用構造函數(即調用它們的非默認構造函數)。

4

此:

Stack() 
{ 
    node.Node(); 
} 

不是調用成員的構造函數的正確方法。改爲使用初始化列表:

Stack(): node() 
{ 
} 

應該指出,顯式調用默認構造函數是沒有必要的。這意味着如果您調用自定義構造函數,則只需要使用初始化列表。

0

簡單地改變類的定義堆棧以下方式,因爲你的這個類的定義是錯誤的

template<class Datatype> 
class Stack 
{ 
    public: 
     Stack() : head(nullptr) 
     { 
     } 
     int push(Datatype &); 
     Datatype pop(); 
     Datatype* peek(); 
    private: 
     Node<Datatype> *head; 
}; 

考慮到,協議棧節點應該只有一個參考到下一個節點帳戶。所以班級節點應該有以下數據成員

class Node 
{ 
//... 
    private: 
     Node* next; 
     Datatype data; 
}; 

應該排除數據成員節點* prev。

此外,它會好得多,如果類節點是內部類的類棧。

+0

哦,是的。我認爲把節點的指針有更好的! –

+0

這是我的考慮。 Node類可能用於實現其他數據結構,所以我試圖使其更通用。這就是爲什麼有兩個指針指向兩個方向。 –

+0

@ user3352668它不是堆疊的合適的節點結構。這只是一個糟糕的設計。 –

相關問題