我举以下例子来说明我的问题。假设 Abc
是一个将使用另一个类 (Def
) 的类。假设 Def 是一个具有许多类成员的大型类(复制成本昂贵),让指向 Def 对象的指针成为 Abc 类的一部分更有意义。然后在实现Abc
类函数do1
时,可以通过其指针pDef
引用Def对象。
class Abc
{
public:
Abc(Def &def)
{
pDef = &def;
}
~Abc()
{
}
void do1();
private:
Def *pDef;
}
但是,如果我以这种方式实现类 Abc,我将面临 Def
指针可能无效的风险。关于改进此类设计有什么想法吗?我的一个想法是使用共享指针:
class Abc
{
public:
Abc(boost::shared_ptr<Def> def)
{
pDef = def;
}
~Abc()
{
}
void do1();
private:
boost::shared_ptr<Def> pDef;
}
编辑:我想澄清的是,我的主要目的是避免构造类 Abc
时昂贵的复制操作。对我来说,使用共享指针和 James Adkison 的解决方案(接受的答案)都可以解决问题。但对昂贵的 Def
对象的影响可能会有所不同。使用共享指针将保留该对象的许多拷贝,而使用 James Adkison 的解决方案将仅保留 Def
对象的一份拷贝。
最佳答案
Assume Def is a large class with many class members
我认为这意味着复制 Def
类的成本很高。但是,使用 C++11,您可以为 Def
实现移动语义,并保持 Abc
实现简单高效。
注意:这个答案基于这样的假设:问题使用任何指针(智能或其他)的唯一原因是为了避免昂贵的拷贝。
示例代码
class Def
{
public:
Def() {}
Def(const Def& other) { /* ... */ } // Copy constructor even though it's expensive
Def(Def&& other) { /* ... */ } // Move constructor for efficiency
Def& operator=(const Def& other) { /* ... */ } // Copy assignment
Def& operator=(Def&& other) { /* ... */ } // Move assignment
};
现在,Def
类支持复制语义,尽管复制该类可能会很昂贵。不过,它还支持移动语义,以便在不需要拷贝时实现高效使用。
class Abc
{
public:
Abc() {}
Abc(const Def& def) : mDef(def) {} // Perform an expensive copy
Abc(Def&& def) : mDef(std::move(def)) {} // Perform a move
// Implement any other member functions which could accept Def
// via copy or move
private:
Def mDef;
};
如果用例实际上是为了支持共享所有权语义,我只会提倡使用 std::shared_ptr
。
关于c++ - 当一个类包含另一个类的实例时的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204671/