[英]How to call constructor of a class that is within another class in 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’
一開始,我沒有為Stack編寫構造函數。 但是,我覺得實際上沒有調用我定義的node的構造函數,因為next和prev指針中有一些值。 因此,我嘗試編寫一個Stack的構造函數,以顯式調用Node的構造函數。 不幸的是,出現了上面顯示的編譯錯誤。 我想知道如何調用另一個類中的一個類的構造函數。
謝謝,周凱文
這個:
Stack()
{
node.Node();
}
是調用成員構造函數的正確方法。 請使用初始化列表:
Stack(): node()
{
}
應該注意的是,沒有必要顯式調用默認構造函數。 這意味着,如果要調用自定義構造函數,則只需要真正使用初始化列表即可。
如果您不執行任何操作,則將調用該node
成員的默認構造函數。
如果要顯式構造成員,請在構造函數的初始值設定項列表中進行操作 :
Stack()
: node()
{}
由於將始終調用默認構造函數,因此僅當您需要將參數傳遞給構造函數(即,調用其非默認構造函數)時,顯式構造成員才有用。
只需按照以下方式更改類Stack的定義,因為您對類的定義是錯誤的
template<class Datatype>
class Stack
{
public:
Stack() : head( nullptr )
{
}
int push(Datatype &);
Datatype pop();
Datatype* peek();
private:
Node<Datatype> *head;
};
考慮到堆棧節點應該只對下一個節點有一個引用。 因此,類Node應該具有以下數據成員
class Node
{
//...
private:
Node* next;
Datatype data;
};
數據成員Node * prev應該被排除。
同樣,如果Node類是STack類的內部類,那就更好了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.