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_ptr从Boost.SmartPtr例如(其将被包括在新的C++标准).或者任何其他共享指针实现,因为这是一个很常见的概念,可以使用许多实现.