我正在考虑在游戏中使用“自杀对象”来模拟实体,即可以删除自身的对象。通常的C++03实现(简单地delete this
)对于可能引用自杀对象的其他对象不起作用,这就是为什么我要使用std::shared_ptr
和std::weak_ptr
。
现在是代码转储:
#include <memory>
#include <iostream>
#include <cassert>
struct SuObj {
SuObj() { std::cout << __func__ << '\n'; }
~SuObj() { std::cout << __func__ << '\n'; }
void die() {
ptr.reset();
}
static std::weak_ptr<SuObj> create() {
std::shared_ptr<SuObj> obj = std::make_shared<SuObj>();
return (obj->ptr = std::move(obj));
}
private:
std::shared_ptr<SuObj> ptr;
};
int main() {
std::weak_ptr<SuObj> obj = SuObj::create();
assert(!obj.expired());
std::cout << "Still alive\n";
obj.lock()->die();
assert(obj.expired());
std::cout << "Deleted\n";
return 0;
}
问题
这段代码似乎运行良好。然而,我希望有其他人的眼睛来评估它。这段代码是否有意义?我是否盲目地进入了未知的领域?我应该放下键盘立即开始艺术学习吗?
我希望这个问题对于 Stack Overflow 已经足够窄化了。对于 CR 来说,似乎有点微小和低级。
小精度
我不打算在多线程代码中使用它。如果需要,我一定会重新考虑整个事情。
obj.lock
分配给一个shared_ptr
并确保在那个时刻它没有过期,来添加另一个测试,但我不认为这会有任何区别。 - Mark Ransomdie()
方法指的是游戏角色实际上“死亡”,比如飞船被炸成碎片之类的。例如:if (spaceship->hitpoints() <= 0) spaceship->die()
。 - JasonWeakPointerFactory
的对象,正好是您想实现的内容。他们使用自己的shared_ptr
和weak_ptr
,所以您无法直接使用该代码。然而,该代码可能会给您在设计方面提供一些启示。 - Mateusz Kubuszokshared_ptr
确实过于复杂了,因为我仅使用其功能的一半,但我现在不确定是否想要自己实现它(肯定不是为了一个POc)谢谢您的文章,它肯定会很有用! - Quentinshared_ptr
,将锁定的shared_ptr
包装在一个不可复制、不可移动、不可操作的对象中怎么样? - Quentin