我有一个使用图书馆进行交流的课程,如下所示:
class Topic {
Topic( Type T, String name );
};
class Reader {
Reader (Topic, String name);
};
class Writer {
Writer (Topic, String name);
};
我想做一个像这样的讲话者课程:
Talker (Type T, String name);
使用构造函数生成成员Writer和Reader。
我在用指针做之间徘徊:
class Talker {
Topic* m_Topic;
Reader* m_Reader;
Writer* m_Writer;
Talker (Type T, String name) {
m_Topic = new Topic (T, generateTopicName(name));
m_Reader = new Reader (m_Topic, generateReaderName(name));
m_Writer = new Writer (m_Topic, generateWriterName(name));
}
};
Versus直接:
class Talker {
Topic m_Topic;
Reader m_Reader;
Writer m_Writer;
Talker (Type T, String name) :
m_Topic(T, name),
m_Reader(m_Topic, generateReaderName(name)),
m_Writer(m_Topic, generateWriterName(name))
{}
};
我正在与一位同事交谈,显然后者因为依赖于成员初始化顺序而很糟糕。但是,它还有一个工作自动复制构造函数。
更好的方法是这样做,特别是如果成员对象列表变长了?
答案 0 :(得分:5)
这样的决定不应该基于你的同事建议的论点,因为这是一个无效的论点。即使对象成员,您也可以控制初始化的顺序 - 请参阅我的最后一段。决定应基于:
1)功能 - 您需要多态类型吗? {1}},Topic
和Reader
会被继承吗?如果是,您应该使用指针来防止对象切片。
2)逻辑 Writer
是成员(对象)的真正所有者还是仅指向多个类之间共享的某些对象?
另一种方法是使用智能指针代替成员。这样您仍然可以享受自动内存管理的优势。
然而,如果你知道你的C ++,你的同事的论点是无效的,后一个选项也不错。成员按照Talker
中声明的顺序进行初始化。因此,class
将首先初始化,m_Topic
秒,最后m_Reader
。如果初始化顺序很重要(代码气味),只需重新排序类定义中的成员。
答案 1 :(得分:0)
它在很大程度上取决于你将如何使用这些类,但一般来说,堆分配越少越好,所以我倾向于在构造函数中皱眉,其中包含所有new
个。成员初始化顺序的依赖性真的是一个问题吗?我可以想象为什么会这样。
如果您使用指针,那么使用智能指针是合理的,std::unique_ptr
是规范选择。
答案 2 :(得分:0)
这实际上取决于您的要求
指针版本更灵活
但是
指针模型相当
会员模型相当