【发布时间】:2012-07-01 02:15:21
【问题描述】:
我会用std::map<int, A>
A 是一个类,我必须防止浅拷贝,
但是有很多像A 这样的类,所以做一个深拷贝构造和操作符是很烦人的。
由于似乎我不必使用复制构造函数和复制赋值运算符,
我决定不使用它们。
为了防止一些错误,我做了一个UnCopyable类,它有私有的拷贝构造函数和拷贝赋值运算符,A继承了它。
但是,有一个问题。 std::map 使用复制构造函数。
我不想在地图中保存A 的指针。
什么是更好的解决方案?
【问题讨论】:
-
如果您担心显式删除,您可以将智能指针 (
std::shared_ptr<A>) 存储为值,而不是原始指针。 -
为什么不可复制?因为其他人有指向它的指针,或者只是因为正确的副本需要很深?如果您知道复制构造函数只会从临时对象中复制,您可能会考虑在复制构造函数中实现“移动”语义。
-
我通过使用句柄类解决了这个问题。
-
@Potatoswatter:在复制构造函数中移动语义,比如
std::auto_ptr?这似乎不是一个好主意(不是因为这个原因不鼓励使用auto_ptr吗?)。 -
@Grizzly 如果您只打算在初始化时复制,那还不错。
std::map不执行任何重新分配;唯一需要的副本来自传递给insert的值。所以你可以让它像auto_ptr一样,除了一个非空值抛出而不是复制。当然,在 C++11 中,问题很容易解决。
标签: c++ stl initialization copy-constructor shallow-copy