前提・実現したいこと
C++でゲームプログラムを組んでいます。UpdateやDrawといった機能をComponentの派生クラスとして作り、それをゲームに登場するキャラクタークラスにComponentのポインタとして(ポリモフィズムの為)メンバに持たせる形で実装したいです。さらに、キャストを使わずに実現したいです。
そこで下記のようなコードを書いたのですが、エラーが出てしまい、解決できずに今に至ります。
ご教授願います。
発生している問題・エラーメッセージ
型 "Component *" の値を使用して型 "Draw *" のエンティティを初期化することはできません
該当のソースコード
#include <iostream> #include <unordered_map> using namespace std; //------------------------------------ // 様々なコンポーネントの基底クラス // virtual get()関数は派生クラスでthisを返すようにし、例えば // Component* co = new Draw(); // Draw* draw = co->get()で派生クラスを取得するつもりだったが、上手くいかず…… //------------------------------------ class Component { public: virtual void update() = 0; virtual Component* get() { cout << "Component get" << endl; return this; } }; //------------------------------------ // Updateコンポーネント //------------------------------------ class Update : public Component { public: void update() { cout << "Update update" << endl; } Update* get() { cout << "Update get" << endl; return this; } }; //------------------------------------ // Drawコンポーネント //------------------------------------s class Draw : public Component { public: void update() { cout << "Draw update" << endl; } virtual Draw* get() { cout << "Draw get" << endl; return this; } }; //------------------------------------ // ゲームに登場するクラスの基底クラス //------------------------------------ class GameObject { public: // コンポーネントリストから指定したコンポーネントを返す Component* component( string str ) { return mComponentList.at( str ); } // コンポーネントを登録する void regComponet( string key, Component* co ) { mComponentList.emplace( key, co ); } // コンポーネントリスト unordered_map<string, Component*> mComponentList; }; //------------------------------------ // メイン //------------------------------------ int main() { // コンポーネントの生成 Update* update = new Update(); Draw* draw = new Draw(); // ゲームオブジェクトの生成 GameObject* gameObject = new GameObject(); // ゲームオブジェクトにコンポーネントを登録する gameObject->regComponet( "update", update ); gameObject->regComponet( "draw", draw ); // キャストすれば取得できるが…… // 呼ばれているのはDraw::get()だが、戻り値はComponent* // クラスの中でのthisは派生クラスではないのか…… ? Draw* d = (Draw*)gameObject->component( "draw" )->get(); d->update(); }
補足情報(FW/ツールのバージョンなど)
VisualStudio 2017
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/10 06:19