我有一个头文件,其中包含一个名为'list'的类,以及一个名为'node'的结构,该结构位于该类的私有部分中。这个类和结构一起构成了一个双重线程的酒厂对象列表(酒庄就是它自己的类)。我想知道的是,如果最好在列表构造函数和解构函数中实现和解除节点struct的变量 (就像这个在编译器中抛出错误的例子):
list::list()
{
struct node
{
item = winery::winery()
nextByName = nullptr;
nextByRating = nullptr;
};
headByName = nullptr;
headByRating = nullptr;
}
list::~list()
{
struct node
{
delete item;
delete nextByName;
delete nextByRating;
};
delete headByName;
delete headByRating;
}
当我删除列表构造函数和解构函数中的节点时,我的编译器会抛出错误;所以上面的例子在某些方面显然是不正确的。但在我看来,如果没有这种方法,解决方案就可以解决,而不是使用这个确切的代码。
我也很好奇是否更好地分别实现和解除结构 (像这样):
list::node::node()
{
item = winery::winery()
nextByName = nullptr;
nextByRating = nullptr;
}
list::node::~node()
{
delete item;
delete nextByName;
delete nextByRating;
}
当我单独删除这些元素时(上图),我的构造函数只会抛出delete item;
的错误。你知道为什么吗?你能解释为什么我不需要删除酒厂项目吗?我应该在那里打电话给酒厂解构师吗?
我应该做一些完全不同的事吗?我看过网上,在我的教科书中,但确实没有明确的答案。我真的很感谢你们的帮助,如果你能解释为什么你的解决方案是最好的(如果它是最好的),我将非常感激。几个月前我才开始学习C ++。
顺便说一句,这就是我的list.h文件:
#include "winery.h"
class list
{
public:
list();
~list();
void addWinery();
void removeWinery();
void displayByRating() const;
void displayByName() const;
void searchByName() const;
private:
struct node
{
winery item;
node * nextByName;
node * nextByRating;
};
node * headByName;
node * headByRating;
};
答案 0 :(得分:0)
要进行初始化,您可以这样做:
class list
{
public:
list();
// etc.
private:
struct node
{
winery item;
node * nextByName = nullptr;
node * nextByRating = nullptr;
};
node * headByName = nullptr;
node * headByRating = nullptr;
};
然后你不需要构造函数采取任何进一步的行动。
你的析构函数虽然可疑。如果每个node *
都应该拥有它所指向的对象,那么请使用std::unique_ptr<node>
代替node *
。如果不是,那么delete
就不是正确的解决方案。