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