我有一个使用库进行通信的类,如下所示: class Topic { Topic( Type T, String name );};class Reader { Reader (Topic, String name);};class Writer { Writer (Topic, String name);}; 我想做一个像这样的说话者课: Talke
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)); } };
直接对比:
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)) {} };
我正在与同事交谈,显然后者因为依赖于成员初始化顺序而很糟糕.但是,它还有一个工作自动复制构造函数.
什么是更好的方式来做这样的事情,特别是如果成员对象列表变得更长?
这样的决定不应该基于你的同事建议的论点,因为这是一个无效的论点.即使对象成员,您也可以控制初始化的顺序 – 请参阅我的最后一段.决定应基于:1)功能 – 你需要多态类型吗?主题,读者和作者会被继承吗?如果是,您应该使用指针来防止对象切片.
2)Logical Is Talker是成员(对象)的真正所有者还是只是指向多个类之间共享的一些对象?
老答案
另一种方法是使用智能指针代替成员.这样您仍然具有自动内存管理的优势.
但是,如果你知道你的C,你的同事的论点是无效的,后一种选择也不错.成员按照在类中声明的顺序进行初始化.因此m_Topic将首先被初始化,m_Reader将被初始化,最后是m_Writer.如果初始化顺序很重要(代码味道),只需重新排序类定义中的成员.