gpt4 book ai didi

c++ - 我应该在其包含类的构造函数中初始化结构的变量吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:40 26 4
gpt4 key购买 nike

我有一个头文件,其中包含一个名为“list”的类和一个位于该类私有(private)部分的名为“node”的结构。这个类和结构将一起构成酒厂对象的双线程链表(酒厂是它自己的类)。我想知道的是,是否最好在列表构造函数和析构函数中实现和取消实现节点结构的变量(就像这个在编译器中抛出错误的例子):

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不是正确的解决方案。

关于c++ - 我应该在其包含类的构造函数中初始化结构的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com