【问题标题】:Can I prevent a copy constructor with some exception?我可以防止复制构造函数有一些例外吗?
【发布时间】: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


【解决方案1】:

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

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

A( A const & ) = delete;

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

【讨论】:

    【解决方案2】:

    您可以使用像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;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-31
      • 2012-12-05
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多