我可以阻止复制构造函数有一些例外吗?

时间:2012-06-29 14:27:30

标签: c++ stl initialization copy-constructor shallow-copy

我将使用std::map<int, A>

A是一个类,我必须防止浅拷贝, 但是有许多类如A,因此制作深层复制构造和运算符是令人厌倦的。 既然看起来我不必使用复制构造函数和复制赋值运算符, 我决定不使用它们。

为了防止出现一些错误,我制作了UnCopyable类,它有私有拷贝构造函数和拷贝赋值运算符,而A继承了它。

然而,有一个问题。 std::map使用复制构造函数。

我不想在地图中保存A的指针。

什么是更好的解决方案?

2 个答案:

答案 0 :(得分:3)

您可能会考虑尝试使用C ++ 11,它有一些解决此类问题的方法:std::map::emplace取消了A的可复制要求,std::move允许您将一个物体转移到另一个物体而不复制。

此外,还有一种新的,更明确的方法可以将类定义为不可复制的:

A( A const & ) = delete;

现在是升级C ++编译器的好时机。

答案 1 :(得分:1)

您可以使用std::shared_ptr之类的智能指针或编写代理类。

E.g:

class Foo {
public:
    std::string name() const;
};

typedef std::shared_ptr<Foo> SharedFoo;

class SharedFoo {
public:
    std::string name() const { return instance->name(); }
private:
    std::shared_ptr<Foo> instance;
};