Player
とEnemy
という2つのクラスがあり、どちらもGameObject
というクラスから継承しています。これらを両方ともGameObject
型の配列に保存するにはどうすればよいですか。独自の情報を保持していますか?
私はこのような配列を作ってみました:
std::vector<GameObject> _gameObjList;
そして、次のようにテストオブジェクトをプッシュしてみました:
testObject test;
_gameObjList.Push_back(test);
しかし、それは私に次の例外エラーを与えました:
エラーC2664 'void std :: Vector <GameObject *、std :: allocator <_Ty >> :: Push_back(_Ty &&)':引数1を 'testObject *'から 'GameObject * const&' OpenGLFramework c:\ usersに変換できません\ name\projects\myproject\gamemanager.cpp 11
つまり、私のテストオブジェクトはGameObject
を継承していますが、基本的には型は同じである必要があると言っています。
ここに私のtestObjectヘッダーファイルがあります:
#pragma once
#include "GameObject.h"
class testObject : public GameObject
{
public:
testObject();
testObject(float xPosition, float yPosition, float zPosition);
void Update();
~testObject();
};
Cppファイルには、コンストラクターと更新メソッド以外は何も含まれていませんが、現時点ではすべて空なので、ここに表示する必要はないと思います。
私はここにいる誰もがこれを行う適切な方法を私に説明でき、そして/または私のコードのエラーを指摘できることを願っています。オブジェクトを簡単に追加/削除できるように、すべてのゲームオブジェクトの配列リストが欲しいだけです。
Std :: vector <std :: shared_ptr <GameObject >>を使用する
std::vector<std::shared_ptr<GameObject>> v;
v.Push_back (make_shared<Player> ());
v.Push_back (make_shared<Enemy> ());
Player、Enemy、GameObjectを直接使用しているようにコードを見せたい場合は、typedefを導入できます。
using GameObjectP = shared_ptr<GameObject>;
struct PlayerP : shared_ptr<Player> {
PlayerP() : shared_ptr<Player> {make_shared<Player> ()} {};
};
struct EnemyP: shared_ptr<Enemy> {
EnemyP() : shared_ptr<Enemy> {make_shared<Enemy> ()} {};
};
std::vector<GameObjectP > v;
v.Push_back (PlayerP ());
v.Push_back (EnemyP());
さて、 std::vector<T>
はT
sへのポインタではなく、T
sの動的配列です。
したがって、異種のオブジェクトを何らかの方法で格納する方法が必要です。
まあ、1つ std::any
またはより効率的な std::variant
オプションを知っている場合all。
または、ポインタ、できればスマートポインタを保存できます。これは一般的に std::unique_ptr
または実際に所有権を共有する必要がある場合 std::shared_ptr
。
どの代替案が最適ですか?
それはあなたの詳細に依存します、それらをよく見て、選択してください。