4

我有一个使用库进行通信的类,如下所示:

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))
  {}
};

我正在和一位同事交谈,显然后者很糟糕,因为它依赖于成员初始化顺序。但是,它也有一个有效的自动复制构造函数。

有什么更好的方法来处理这样的事情,特别是如果成员对象列表变得更长?

4

3 回答 3

5

像这样的决定不应该基于你同事建议的论点,因为这是一个无效的论点。即使使用对象成员,您也可以控制初始化的顺序 - 请参阅我的最后一段。该决定应基于:

1)函数式- 你需要多态类型吗?会TopicReaderWriter继承吗?如果是,您应该使用指针来防止对象切片。

2)逻辑Talker成员(对象)的真正所有者还是它只是指向多个类之间共享的一些对象?

旧答案

另一种方法是使用智能指针作为成员。这样你仍然有自动内存管理的优势。

但是,如果您了解 C++,您同事的论点是无效的,后一种选择也不错。成员按照它们在class. 所以m_Topic将被初始化 first, m_Readersecond 和 last m_Writer。如果初始化顺序很重要(代码味道),只需重新排序类定义中的成员。

于 2012-03-26T18:54:39.640 回答
0

这真的取决于你的要求

指针版本更灵活

  • 对象可能为空
  • 物品可以交换,带走

  • 你必须注意正确的销毁(好的,智能指针会有所帮助)
  • 在 32 位内存环境中,您需要更多内存,至少 3*4 字节,可能更多是由于内存管理的实现细节,很可能是数字的两倍。当你有很多小物体时,这会很痛

指针模型是一个相当

  • 汽车和车轮情况(可交换)

会员模型是一个相当

  • 房屋和房间情况(如果不修改房屋就无法移除房间)
于 2012-03-26T19:11:14.190 回答
0

这在很大程度上取决于您将如何使用这些类,但总的来说,堆分配越少越好,所以我倾向于对包含所有这些news 的构造函数皱眉。对成员初始化顺序的依赖真的有问题吗?我很难想象为什么会这样。

如果您使用指针,那么使用智能指针是合理的,因为它std::unique_ptr是规范的选择。

于 2012-03-26T18:56:01.017 回答