use*_*866 3 c++ factory unique-ptr c++11
说我们上课Foo:
class Foo {
public:
...
};
Run Code Online (Sandbox Code Playgroud)
Foo有一个实例方法,它将Foo实例转换为另一个Foo实例,或返回相同的Foo实例:
<some appropriate pointer type to Foo> Foo::tryToTransform() {
if (canBeTransformed()) {
<delete this Foo instance>;
return <new instance of Foo>;
}
else {
return <this instance of Foo>;
}
}
Run Code Online (Sandbox Code Playgroud)
客户代码:
<some appropriate pointer type to Foo> foo = ...;
...
foo = foo->tryToTransform();
Run Code Online (Sandbox Code Playgroud)
使用裸指针很容易做到这一点:
Foo* Foo::tryToTransform() {
if (canBeTransformed()) {
delete this;
return new Foo(...);
}
else {
return this;
}
}
Foo* foo = ...;
...
foo = foo->tryToTransform();
Run Code Online (Sandbox Code Playgroud)
但是,如果客户端代码使用unique_ptr而不是裸指针呢?也就是说,理想情况下我希望客户端代码看起来像这样:
unique_ptr<Foo> foo = ...;
...
foo = foo->tryToTransform();
Run Code Online (Sandbox Code Playgroud)
应该如何Foo::tryToTransform()定义以启用此类(或类似)客户端代码?
因为你的tryToTransform函数是一个成员函数,调用者保留了所有权unique_ptr.因此,从成员函数中删除调用者是不可能的(没有肮脏的技巧)unique_ptr.
因此,您需要一个拥有以下所有权的静态函数unique_ptr:
class Foo {
static unique_ptr<Foo> tryToTransform(unique_ptr<Foo> ptr) {
if(...) {
return unique_ptr<Foo>(new Foo()); // old ptr is destroyed
} else {
return ptr;
}
};
Run Code Online (Sandbox Code Playgroud)
打电话给
unique_ptr<Foo> foo = ...;
...
foo = Foo::tryToTransform(move(foo));
Run Code Online (Sandbox Code Playgroud)
这是通过拥有tryToTransform所有权来实现的unique_ptr.然后它可以按照自己的意愿销毁指针.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |