如何调用 C++ 中另一个类中的类的构造函数

How to call constructor of a class that is within another class in C++?

本文关键字:构造函数 另一个 C++ 何调用 调用      更新时间:2023-10-16

这是我的代码:

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 编写构造函数。但是,我觉得实际上我没有调用我定义的节点的构造函数,因为 next 和 prev 指针中有一些值。所以我尝试编写一个显式调用 Node 构造函数的 Stack 构造函数。不幸的是,上面显示的编译错误来了。我想知道如何调用另一个类中的类的构造函数。

谢谢Kevin Zhou

这个:

Stack()
{
    node.Node();
}

不是调用成员构造函数的正确方法。请改用初始化列表:

Stack(): node()
{
}

应该注意的是,显式调用默认构造函数是不必要的。这意味着只有在调用自定义构造函数时才真正需要使用初始化列表。

如果不执行任何操作,则将调用node成员的默认构造函数。

如果要显式构造成员,请在构造函数初始值设定项列表中执行此操作:

Stack()
    : node()
{}

由于无论如何都会调用默认构造函数,因此显式构造成员仅在需要将参数传递给构造函数(即调用其非默认构造函数)时才有用。

只需更改类的定义 按以下方式堆叠,因为您对类的定义是错误的

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。

所以如果类节点是类 STack 的内部类会好得多。