c++ - 当一个类包含另一个类的实例时的类设计

标签 c++

我举以下例子来说明我的问题。假设 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/

相关文章:

c++ - 如何优化矩阵乘法运算

c++ - Xcode 的 C++ 语言设置的 'Compiler Default' 是什么?

用于启动多个命令提示符的 System() 的 C++ 替代方案。 WINAPI(无 MFC)

c++ - ft2build.h : No such file or directory - Freetype 2. 6

c++ - SignalObjectAndWait 考虑有 SetEvent 和 WaitForSingleObject 的目的是什么?

c++ - 将参数传递给 "array-like"容器构造函数

c++ - 用 malloc 替换 operator new

c++ - 不调用对象的析构函数是未定义的行为吗?

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

c++ - 使用 libcurl 上传带有特殊字符的文件名