各ポインターが個別のエンティティ クラスを指すスマート ポインターのリストがあります。
std::list<std::unique_ptr<Entity>> m_entities;
クラスのインスタンス化時にコードによって「自動的に」処理されるため、コンストラクターが std::list クラスへの各ポインターの割り当てを処理するようにしたいと思います。ただし、この設計が悪い場合は、C# のバックグラウンドを持つ私にとってのみ意味があるため、より良い代替案を歓迎します。
Entity::Entity(Game &game)
: m_game(game),
m_id(m_game.g_idGenerator->generateNewID())
{
m_game.m_entities.push_back(std::unique_ptr<Entity>(this));
}
このメソッドで私が遭遇した主な問題は、Entity クラスの有効期間が Entity クラスによって管理されていないことです。
たとえば、Entity クラスをスタックに割り当てると、割り当てられたメソッドを離れた後に Entity デストラクタが呼び出され、ポインタが無効になります。
そこで、代わりにスマート ポインターを作成し、Entity クラスをヒープに割り当ててから、明示的にリストにポインターを追加する方法を検討しました。
std::unique_ptr<Entity> b(new Entity(*this));
m_entities.push_back(b); // ERROR
これにより、次のエラーが発生します
error C2664: 'void std::list<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'std::unique_ptr<_Ty>' to 'std::unique_ptr<_Ty> &&'
各ポインターをリストに割り当てるための最良のアプローチと考えられるものは何ですか?コンストラクターベースのバージョンは可能ですか?
私は現在、各エンティティ クラスの有効期間を処理する必要があるのはスマート ポインターのリストであり、コンストラクターでポインターを割り当てることは適切な設計上の選択ではないと考えています。その場合、コンストラクターに処理させるのではなく、ポインターをリストに追加する CreateEntity メソッドを作成する必要があります。これは良いですか?
ここ、ここ、およびここ(オフサイト)にある質問を読んだ後、この操作に適したスマート ポインターのタイプを検討しました。私がこれまでに読んだ内容に基づいて正確な答えを得ることは困難ですが、それらはすべて多少矛盾するアドバイスを提供します.