如果一个对象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/