オブジェクトが互いに認識している(つまり、すべてのオブジェクトへのポインタを持つ)クラスを作成しようとしています。スマートポインタや静的メンバーに関するこのアイデアの実装のいくつかの側面を理解できません。スマートポインタを使用してクラスのオブジェクトを追跡するにはどうすればよいですか?
クラスは、他のゲームオブジェクトのメンバー関数とプロパティにアクセスできる必要があるゲームオブジェクトと考えることができます。
私の知る限り、望ましい設計を実装する一般的な方法は、他のオブジェクトへのポインタを含む静的ベクトルです。生のポインタで動作している場合、タスクは非常に複雑ではありません。
GameObject.h:
#pragma once
#include <vector>
class GameObject
{
private:
static std::vector< GameObject* > objects;
public:
GameObject()
{
objects.push_back(this);
}
};
GameObject.cpp:
#include "GameObject.h"
std::vector< GameObject* > GameObject::objects = {};
これは実際に私は必要なものを与えるだろう。しかし、私がスマートポインタを使用したい場合、事は私にとっては単純ではありません。 this questionから、そしてMeyersの「Effective Modern C++」の本から、私は約std::enable_shared_from_this
とshared_from_this()
を見つけました。しかし、さらに、the referenceは、既にstd::shared_ptr<>
が所有しているオブジェクトの場合にのみ、shared_from_this()
を使用することが許可されていることを明確に示しています。
したがって、以前と同じ方法で、コンストラクタ内の静的ベクトルthis
ポインタ(またはその上に構築されたstd::shared_ptr
)をコンストラクタにプッシュすることはできません。
GameObject.h:
#pragma once
#include <vector>
#include <memory>
class GameObject : public std::enable_shared_from_this<GameObject>
{
private:
static std::vector< std::shared_ptr<GameObject> > objects;
public:
GameObject() {}
void emplace_ptr()
{
objects.emplace_back(shared_from_this());
}
};
GameObject.cpp:
#include "GameObject.h"
std::vector< std::shared_ptr<GameObject> > GameObject::objects = {};
main.cppに私が分かった設計を可能にするコードの最小セットは、以下であります:
私は明らかに、オブジェクトの外側のどこかにポインタを作成し、ポインタを静的ベクタにプッシュするメソッドを明示的に呼び出すことを義務付けられています(コンストラクタでこれを行うことはできません)。
必要なコードが不必要に複雑になっているという印象を受けています(ローポインタの場合と比較して)。または無意味なことをしています。
- オブジェクトを互いに認識するための私の努力は意味があります ?それは一般的な問題か、他のアプローチは通常 ですか?
- 静的ベクトルは問題のサウンドソリューションですか?
- スマートポインタを使用してこのようなベクターを構築するには、どうすればよいですか? 外部からの介入なしで、 特殊機能
emplace_ptr()
を作成する必要はありませんか?
コンストラクタ 'private'を作ることによって' enable_share_from_this'を取り除き、静的コンストラクタを提供して、ベクトルを供給することができます。 – Jarod42
@ Jarod42、静的な名前のコンストラクタ(または関数を作成する)を意味すると思います。 – lorro