c++ - 具有指向其父对象的指针的对象是否应该定义复制构造函数?

标签 c++

如果一个对象A包含一个成员对象B,并且对象B有一个指向其父对象A的指针,我是否需要为对象B指定一个复制构造函数?

假设没有动态分配。

此外,3 的规则是否适用于此?

最佳答案

您的设计使用双向导航实现组合。这可能是完全有效的。
然而,正如谢尔盖在评论中指出的那样,这样的设计并非没有问题。

假设你有一个类 Object和一类 Container包含 Object .这里有一些基本问题:

Container c;
Object mo1; // Q1: should this be valid ? (i.e. is an object without parent allowed 
Object mo2 = c.o;  // Q2: is this acceptable ?  Q3: Who is parent of mo2 ?  

看问题Q2和Q3:如果这样的初始化是可以接受的,那么直接的问题是你想要什么样的父级:

  • 如果mo2应该没有父级,您需要根据规则 3 的复制构造函数来清除父级。
  • 如果mo2应该引用相同的父对象(尽管它不是成员),您可以保留默认的复制构造函数。

示例:

struct Container; 
struct Object{
    Container *parent;  
    Object (Container *p=nullptr) : parent(p) { cout << "construct object"<<endl; }
    // copy constructor or compiler generated one depending on Q2+Q3
    ~Object() {}
    ...
};
struct Container {
    Object o;
    Container() : o(this) {}
};

如果这样的初始化是 Not Acceptable ,你应该禁止在代码中明确地复制构造。

Object (const Object &o) = delete;  

重要说明:Container可能还需要一个复制构造函数。无论您决定什么Object ,您可能需要在 Container 中处理如果它必须是可复制的。您绝不能在那里使用 Object 的复制构造函数.

重要说明 2:Container本身可能用于更复杂的情况。以 vector<Container> 为例.将新容器添加到 vector 时,可能会执行重定位,如果您没有提供负责的 Container 复制构造函数,这可能会使指针无效!

关于c++ - 具有指向其父对象的指针的对象是否应该定义复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600138/

相关文章:

c++ - 问题签名字符 C++

c++ - 使用 mpic++ 但不使用 g++ 时出现总线错误

c++ - C++ 中的 'and' 关键字

c++ - C++ 中的链接错误

c++ - 矩阵实现类 C++ 中的内存管理

c++ - BeagleBone Black 通过内核驱动中断

c++ - 从抽象类继承创建另一个抽象类时,我应该重新声明所有虚函数吗?

c++ - CUDA:有没有办法强制每一行在继续之前完成?

c++ - 不使用 '/' 运算符的除法

c++ - 为什么 `SetUp`/`TearDown`在gtest中是虚拟的?