web-dev-qa-db-ja.com

共通のベースから派生した異なるタイプのオブジェクトを同じ配列に配置するにはどうすればよいですか?

PlayerEnemyという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ファイルには、コンストラクターと更新メソッド以外は何も含まれていませんが、現時点ではすべて空なので、ここに表示する必要はないと思います。

私はここにいる誰もがこれを行う適切な方法を私に説明でき、そして/または私のコードのエラーを指摘できることを願っています。オブジェクトを簡単に追加/削除できるように、すべてのゲームオブジェクトの配列リストが欲しいだけです。

2
Thomas Linssen

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());
4
Lewis Pringle

さて、 std::vector<T>Tsへのポインタではなく、Tsの動的配列です。

したがって、異種のオブジェクトを何らかの方法で格納する方法が必要です。
まあ、1つ std::any またはより効率的な std::variant オプションを知っている場合all
または、ポインタ、できればスマートポインタを保存できます。これは一般的に std::unique_ptr または実際に所有権を共有する必要がある場合 std::shared_ptr

どの代替案が最適ですか?
それはあなたの詳細に依存します、それらをよく見て、選択してください。

3
Deduplicator