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

时间:2015-09-25 22:40:17

标签: c++ struct linked-list

我有一个头文件,其中包含一个名为'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;
}; 

1 个答案:

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