我有一个头文件,其中有一个名为'list'的类和一个名为'node'的结构体,位于该类的私有部分。这个类和结构体一起构成了一个双线程的winery对象链表(winery是它自己的类)。我想知道的是,如果最好在列表构造函数和解构函数中实现和反实现节点结构的变量(就像这个例子,它会在编译器中抛出错误):
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;
};
要初始化,您可以这样做:
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
就不是正确的解决方案。