Я рассматриваю возможность использования "объектов самоубийства" для моделирования объектов в игре, то есть объектов, способных удалять себя. Теперь обычная реализация С++ 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;
}
Вопрос
Этот код работает нормально. Тем не менее, я бы хотел, чтобы кто-то еще посмотрел на него. Имеет ли смысл этот код? Я слепо плавал в землях? Должен ли я отказаться от клавиатуры и начать заниматься искусством прямо сейчас?
Надеюсь, этот вопрос достаточно сузился для SO. Считается немного крошечным и низкоуровневым для CR.
Незначительная точность
Я не намерен использовать это в многопоточном коде. Если возникнет такая необходимость, я обязательно передумаю все это.