簡體   English   中英

如何在C ++中的另一個類中調用一個類的構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM