gpt4 book ai didi

c++ - unique_ptr 的设计头痛

转载 作者:太空狗 更新时间:2023-10-29 20:23:25 25 4
gpt4 key购买 nike

假设我们有类 Foo:

class Foo {
public:
...
};

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

客户端代码:

<some appropriate pointer type to Foo> foo = ...;
...
foo = foo->tryToTransform();

使用裸指针很容易做到这一点:

Foo* Foo::tryToTransform() {
if (canBeTransformed()) {
delete this;
return new Foo(...);
}
else {
return this;
}
}

Foo* foo = ...;
...
foo = foo->tryToTransform();

但是如果客户端代码使用unique_ptr 而不是裸指针呢?也就是说,理想情况下,我希望客户端代码如下所示:

unique_ptr<Foo> foo = ...;
...
foo = foo->tryToTransform();

应该如何定义 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;
}
};

调用为

unique_ptr<Foo> foo = ...;
...
foo = Foo::tryToTransform(move(foo));

这通过让 tryToTransform 获得 unique_ptr 的所有权来实现。然后它可以根据需要销毁指针。

关于c++ - unique_ptr 的设计头痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com