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

时间:2014-03-03 01:56:31

标签: c++ class constructor

这是我的代码:

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指针中有一些值。所以我试着写一个Stack的构造函数,它显式地调用了Node的构造函数。不幸的是,上面显示的编译错误来了。我想知道如何调用另一个类中的类的构造函数。

感谢, 周凯文

3 个答案:

答案 0 :(得分:4)

此:

Stack()
{
    node.Node();
}

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

Stack(): node()
{
}

应该注意,没有必要显式调用默认构造函数。这意味着如果您正在调用自定义构造函数,则只需要使用初始化列表。

答案 1 :(得分:2)

如果您不做任何事情,将调用node成员的默认构造函数。

如果要显式构造成员,可以在构造函数initializer list中执行:

Stack()
    : node()
{}

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

答案 2 :(得分:0)

只需按以下方式更改类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;
};

应排除数据成员节点* prev。

如果类Node是类STack的内部类,那么它会好得多。