C++ 我是否应该初始化结构';在其包含类的构造函数中的s变量?
我有一个头文件,在该类的私有部分中有一个名为“list”的类和一个名为“node”的结构。这个类和结构一起构成了winery对象的双线程链表(winery是它自己的类)。我想知道的是,是否最好在列表构造函数和解构器中实现和解构节点结构的变量 (如本例,它在编译器中抛出错误): 当我删除列表构造函数和解构器中的节点时,编译器抛出一个错误;所以上面的例子在某些方面显然是不正确的。但在我看来,解决这个问题的方法在没有这种方法的情况下是可行的,只是没有这种精确的代码 我还想知道,单独实现和反实现结构是否更好 (像这样): 当我分别删除这些元素时(如上所述),我的构造函数只为C++ 我是否应该初始化结构';在其包含类的构造函数中的s变量?,c++,struct,linked-list,C++,Struct,Linked List,我有一个头文件,在该类的私有部分中有一个名为“list”的类和一个名为“node”的结构。这个类和结构一起构成了winery对象的双线程链表(winery是它自己的类)。我想知道的是,是否最好在列表构造函数和解构器中实现和解构节点结构的变量 (如本例,它在编译器中抛出错误): 当我删除列表构造函数和解构器中的节点时,编译器抛出一个错误;所以上面的例子在某些方面显然是不正确的。但在我看来,解决这个问题的方法在没有这种方法的情况下是可行的,只是没有这种精确的代码 我还想知道,单独实现和反实现结构是否
delete项抛出错误代码>。你知道这是为什么吗?你能解释一下为什么我不需要删除酒厂项目吗?我应该叫那里的酿酒厂解构师吗
我应该做些完全不同的事情吗?我在网上看过,在我的课本上也看过,但这方面确实没有明确的答案。我非常感谢你们的帮助,如果你们能解释为什么你们的解决方案是最好的(如果是最好的),我将非常感激。我刚开始学习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;
};
然后,您不需要构造函数来执行任何进一步的操作
不过你的破坏者很可疑。如果每个节点*
都应该拥有它所指向的对象,则使用std::unique\u ptr
而不是节点*
。如果不是,则删除不是正确的解决方案。要初始化,可以执行以下操作:
class list
{
public:
list();
// etc.
private:
struct node
{
winery item;
node * nextByName = nullptr;
node * nextByRating = nullptr;
};
node * headByName = nullptr;
node * headByRating = nullptr;
};
然后,您不需要构造函数来执行任何进一步的操作
不过你的破坏者很可疑。如果每个节点*
都应该拥有它所指向的对象,则使用std::unique\u ptr
而不是节点*
。如果不是,则delete
不是正确的解决方案。放置struct节点{ <代码> >函数内声明了一个名为<代码>节点> /代码>该函数的类。看起来好像您引用了一个不同的结构节点,或某个.Read警报,零/三/五违反规则;考虑复制/移动/分配,请注意<代码>结构节点。{ <代码> >函数内声明了一个名为<代码>节点> /代码>该函数的类。看起来好像您引用了一个不同的结构节点,或某个.Read警报,零/三/五违反规则;考虑复制/移动/分配,请把这个评论贴到我的问题上,我想他们删除了它。“在编写任何代码之前,您需要了解new
和delete
实际上做了什么。第一条规则是永远不要delete
那些不是由new
创建的东西。任何编译器都会给您一长串关于上述代码的错误,这也应该警告您。"你知道这是什么意思吗?@Larrimus是的,你似乎只是在你的析构函数中写delete
,而不了解你在做什么,或者我知道为什么,delete是指针。在这种情况下,我应该如何处理酒厂项目?我应该在那里调用酒厂析构函数吗?如果我在一个类中有int myint
,是吗调用delete&myint
是否实用或合适?不,这是错误的。如果您不了解它们的功能,请停止操作。delete
仅用于释放由new
分配的对象。您不需要对酒厂项目执行任何操作。有人在我的问题中发布了此评论,我猜他们删除了它,尽管如此:“在编写任何代码之前,您需要了解new
和delete
实际上做了什么。第一条规则是永远不要delete
那些不是由new
创建的东西。任何编译器都会给您一长串关于上述代码的错误,这也应该警告您。”你知道这是什么意思吗?@Larrimus是的,你似乎只是在你的析构函数中写delete
,而不了解你在做什么,或者我知道为什么,delete是指针。在这种情况下,我应该如何处理酒厂项目?我应该在那里调用酒厂析构函数吗?如果我在一个类中有int myint
,是吗调用delete&myint
是否实用或合适?不,这是错误的。如果您不了解它们的功能,请停止操作。delete
仅用于释放由new
分配的对象。您不需要为酒厂项目执行任何操作。
class list
{
public:
list();
// etc.
private:
struct node
{
winery item;
node * nextByName = nullptr;
node * nextByRating = nullptr;
};
node * headByName = nullptr;
node * headByRating = nullptr;
};