我应该如何构建相互依赖的C ++成员?

时间:2012-03-26 18:50:53

标签: c++ pointers members

我有一个使用图书馆进行交流的课程,如下所示:

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

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

更好的方法是这样做,特别是如果成员对象列表变长了?

3 个答案:

答案 0 :(得分:5)

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

1)功能 - 您需要多态类型吗? {1}},TopicReader会被继承吗?如果是,您应该使用指针来防止对象切片。

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

旧答案

另一种方法是使用智能指针代替成员。这样您仍然可以享受自动内存管理的优势。

然而,如果你知道你的C ++,你的同事的论点是无效的,后一个选项也不错。成员按照Talker中声明的顺序进行初始化。因此,class将首先初始化,m_Topic秒,最后m_Reader。如果初始化顺序很重要(代码气味),只需重新排序类定义中的成员。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这实际上取决于您的要求

指针版本更灵活

  • 对象可以为null
  • 物品可以被交换,带走

但是

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

指针模型相当

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

会员模型相当

  • 房屋和房间的情况(没有修改房屋就无法拆除房间)