gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:41 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com