在头文件中分配内存而不是在构造函数中

时间:2016-05-06 20:09:26

标签: c++ object

这被认为是不好的风格(在建筑师之外的标题中做新的事情)?

class ClassName : public QWidget
{
    Q_OBJECT
public:
    explicit ClassName(QWidget* parent = 0);

    CustomList<Identifier*>*const identifier_list = new CustomList<Identifier*>("someString");

};

我想要实现的目标是不必在任何地方写if (identifier_list == NULL)。像这样,identifier_list不能为NULL。

1 个答案:

答案 0 :(得分:0)

由于默认的成员初始化程序,当然只能在C ++ 11及更高版本中使用。但是,通过写这个,你是now required to provide (or =delete) your copy/move constructors and assignment operators。更不用说要删除这个内存的析构函数。

这意味着您必须决定要拥有的复制行为。您是否想要允许复制(如果没有,您必须使用=delete来表示)?如果是这样,副本应该做什么?由于它是指针const,因此您无法复制指针本身。至少,不在复制分配的情况下。因此,如果你正在复制,你现在必须复制指向的对象。

感谢你的指针 - const,移动是不可能的(没有const_cast)。所以你的移动构造函数/赋值必须移动CustomList<Identifier*>对象,而不仅仅是指向它的指针。

此外,由于所有这些用户定义的操作,您的ClassName将不再被视为一种简单的可复制类型。虽然它存储了一个链表,但它可能不会轻易地复制。

那么这被认为是不好的风格吗?一切都是平等的,是的。除非你有一个真正的,经过深思熟虑的理由使用动态分配,否则它更好,最终更安全的编程风格,只是让它成为一个值而不是一个指针:

CustomList<Identifier*> identifier_list("someString");