【问题标题】:Avoid copying complex data in class constructor避免在类构造函数中复制复杂数据
【发布时间】:2016-11-05 22:49:02
【问题描述】:

假设我有一个类,其中一个成员变量是另一个复杂类。我想避免创建这个复杂类的副本,我只想在我的类中使用它。那么组织 MyClass 的最佳方式是什么?

目前我有这样的事情:

class MyClass  
{
public:
    MyClass(const ComplexClass& complex_class)
    : m_class(complex_class) {}

private:
     const ComplexClass& m_class;  // What is the best practice here?
};

我可以这样做吗?或者也许 m_class 应该是一个指针?或者在这种情况下你会怎么做?

【问题讨论】:

  • 我将构造函数写为explicit MyClass(const ComplexClass* p) : m_class(*p) {} 以避免令人讨厌的意外。
  • @Kerrek SB 有什么惊喜?
  • 您当然可以这样做,前提是传入的引用保持在范围内,并且在类不再需要它之前不会破坏引用的对象。但如果没有保证引用保持有效的合同,则必须复制对象。
  • 这太宽泛了。 C++ 中的资源管理是一个很大的话题,不可能用一个 SO 答案(或十个)来解释。
  • @AlexShirokov:就像悬空引用和无意的隐式转换......

标签: c++ oop reference


【解决方案1】:

如果你能保证传递的引用在对象生命周期内是有效的,那么这个解决方案就足够了。

如果不是,我建议使用一些智能指针,例如shared_ptr 将延长传递数据的生命周期。

(注意你不仅要重新组织你的类,还要声明complex_class对象)

【讨论】:

    【解决方案2】:

    初始化列表将只允许初始化,因此语法:m_class(complex_class) 将不起作用。初始化列表将调用构造函数而不是复制构造函数。所以我不确定建议的代码是否会编译。

    您可以选择通过获取m_class 的构造函数将获取的输入来初始化成员变量。 const 的使用有助于成员变量的值在对象的生命周期内未更改,但始终可以制作对象的副本,这可能会很昂贵。如果目的是避免昂贵的副本,那么您希望将复制构造函数和赋值运算符设为私有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2013-07-08
      相关资源
      最近更新 更多