我可以阻止复制构造函数出现一些异常吗?

Can I prevent a copy constructor with some exception?

本文关键字:异常 复制 构造函数 我可以      更新时间:2023-10-16

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

A是一堂课,我必须防止浅拷贝,但是有很多像A这样的类,所以做一个深拷贝结构和运算符是很烦人的。由于我似乎不必使用复制构造函数和复制赋值运算符,我决定不使用它们。

为了防止一些错误,我做了UnCopyable类,它有私有复制构造器和复制赋值运算符,A继承了它。

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

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

更好的解决方案是什么?

您可以考虑尝试 C++11,它对此类问题有几个解决方案:std::map::emplace消除了对 A 的可复制要求,std::move允许您将一个对象转移到另一个对象而无需复制。

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

A( A const & ) = delete;

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

您可以使用智能指针(如 std::shared_ptr)或编写代理类。

例如:

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;
};