C++ 我是否应该初始化结构';在其包含类的构造函数中的s变量?

C++ 我是否应该初始化结构';在其包含类的构造函数中的s变量?,c++,struct,linked-list,C++,Struct,Linked List,我有一个头文件,在该类的私有部分中有一个名为“list”的类和一个名为“node”的结构。这个类和结构一起构成了winery对象的双线程链表(winery是它自己的类)。我想知道的是,是否最好在列表构造函数和解构器中实现和解构节点结构的变量 (如本例,它在编译器中抛出错误): 当我删除列表构造函数和解构器中的节点时,编译器抛出一个错误;所以上面的例子在某些方面显然是不正确的。但在我看来,解决这个问题的方法在没有这种方法的情况下是可行的,只是没有这种精确的代码 我还想知道,单独实现和反实现结构是否

我有一个头文件,在该类的私有部分中有一个名为“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;
};