假设我有一个类,其中一个成员变量是另一个复杂的类。我想避免创建这个复杂类的副本,我只想在我的课堂上使用它。那么组织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应该是一个指针?或者在这种情况下你会做什么?
答案 0 :(得分:0)
如果可以保证传递的引用在对象生存期内有效,那么这个解决方案就足够了。
如果不是,我会建议使用一些智能指针,例如shared_ptr将延长传递数据的生命周期。
(注意,您不仅需要重新组织您的类,还需要重新声明complex_class
对象)
答案 1 :(得分:0)
初始化列表仅允许初始化,因此语法:m_class(complex_class)
将不起作用。初始化列表将调用构造函数而不是复制构造函数。所以我不确定建议的代码是否会编译。
您可以选择初始化成员变量,方法是获取m_class
的构造函数所采用的输入。 const用法有助于在对象的生命周期期间不更改成员变量的值,但是可以始终创建对象的副本,这可能很昂贵。如果目的是避免使用昂贵的副本,那么您希望将复制构造函数和赋值运算符设置为私有。