如何在一个必须复制构造的类中使用std :: auto_ptr?

Pas*_*rly 8 c++ smart-pointers auto-ptr

我有foo一个包含std :: auto_ptr成员的类,我想复制构造,但这似乎不允许.作业有类似的东西.请参阅以下示例:

struct foo
{
private:
    int _a;
    std::string _b;
    std::auto_ptr< bar > _c;

public:
    foo(const foo& rhs)
        :   _a(rhs._a)
        ,   _b(rhs._b)

        ,   _c(rhs._c)
                // error: Cannot mutate rhs._c to give up ownership - D'Oh!
    {
    }

    foo& operator=(const foo& rhs)
    {
         _a = rhs._a;
         _b = rhs._b;

         _c = rhs._c;
             // error: Same problem again.
    }
};
Run Code Online (Sandbox Code Playgroud)

我可以声明_c,mutable但我不确定这是否正确.有没有人有更好的解决方案?

编辑

好吧,我没有得到我期待的那种答案,所以我会对这个问题有所了解.

  • 类型的对象foo在堆栈上创建,并通过值传递到容器类(而不是stl),然后超出范围.我对容器代码没有任何控制权.(它实际上是一个活动的队列实现,有bug.)
  • bar班是一个相当重量级的解析器.它的性能非常差new,delete因此即使它是可复制的,也会太昂贵.
  • 我们可以保证在bar创建对象时,它一次只需要在一个地方拥有.在这种情况下,它在线程之间传递,并在事务完成时被删除.这就是我希望使用的原因std::autp_ptr.
  • 我非常愿意考虑提升智能指针,但如果有其他方法,我希望能保证这种独特性.

Ada*_*ura 16

您可能想尝试以下代码:

    foo(const foo& rhs)
        :   _a(rhs._a)
        ,   _b(rhs._b)
        ,   _c(_rhs._c.get() ? new bar(*_rhs._c.get()) : 0)
    {
    }
Run Code Online (Sandbox Code Playgroud)

(作业运算符类似.)

但是,这只有在barCopyConstructible的情况下才有效,如果这确实符合您的要求.问题是两个foo对象(_rhs和构造的对象)将具有不同的指针_c.

如果您希望它们共享指针,那么您不能使用auto_ptr它,因为它不支持共享所有权.考虑在这样的情况下使用的shared_ptrBoost.SmartPtr例如(其将被包括在新的C++标准).或者任何其他共享指针实现,因为这是一个很常见的概念,可以使用许多实现.


Mar*_*age 8

正如你所发现的std::auto_ptr那样,你无法复制那样的东西.拥有该对象的副本指向后?相反,你应该使用引用计数智能指针.该Boost库有一个shared_ptr的,你可以使用.