我的问题是默认复制构造。弄乱了我的指针。
简化版:
我有一个带有默认复制构造的
A
类。A
有 2 个成员对象:B
和C
。B
有一个指向C
的指针。
情况:
我将
A
存储在std::vector
中:vector.emplace_back(A(...));
emplace_back 这样做:
创建 A(设置B指向C的指针等)
复制 A 到 vector 中。 (默认复制点击率:按值复制)
摧毁“起源”A。
. 结果:
- 存储有一个
A
,它有一个B
,它有一个指向旧 A 的C 的指针。它不再存在了。
简单的解决方案是:
- 在
A
中会有指向B
和C
的指针>
但这不是很好,因为当 A 拥有它的 B 和 C 并且 B 和 C 与 A 共享生命周期时,为什么 A 应该有指针。
问题:
有没有比在 A 中使用指针更好的方法?
或者有没有比搞乱复制构造函数实现更简单的方法?
我认为 emplace 构造“就地”,那么为什么它需要复制点击率?
最佳答案
Isn't there a better way than having pointers in A?
是的,有。此外,我看不出在 A
中使用指针如何解决问题。
一个解决方案是为 A
编写一个用户定义的复制构造函数,它将更新复制成员的指针。
Or isn't there a simplier way than messing with copy constructor implementations?
不,复制构造函数(也许可以说?)是更新成员的成员指针的最简单方法。
I thought that emplace constructs "in-place"
确实如此。
so why does it need a copy ctr?
一般不会。
在这种情况下,它确实需要移动或复制构造函数,因为您向它传递了一个临时对象。 vector 中的对象是“就地”构建的,方法是使用移动(或复制,如果不可移动)构造函数,并将临时对象作为参数。
相反,您可以将 A
的构造函数的参数直接传递给 emplace_back
,这样就不会涉及临时变量。
请注意,就地构建对象不会阻止 vector 元素被复制,除非您预先保留内存以便不会发生重新分配。
关于c++ - 将元素插入容器 : copy constructor messes up pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325263/