这是我的代码:
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的构造函数。不幸的是,上面显示的编译错误来了。我想知道如何调用另一个类中的类的构造函数。
感谢, 周凯文
答案 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的内部类,那么它会好得多。