お世話になっております。独学でゲームを開発しています。
シーケンス推移の実装で困っています。
##前提
インターフェイスとして機能する抽象クラス(StageBaseクラス)を派生した様々なGameStageクラスを作り、それのnew/deleteでステージ推移を管理しようとしています。
enumでゲームステージを区別し、std::mapを用いてenumでゲームステージクラスのポインタを呼び出し適宜生成しようと考え、以下のようなクラスを定義しました。
c++
1class StageBase{//GameStageの基底 2 virtual void draw() = 0; 3 virtual void update() = 0; 4 static StageBase* build(){ 5 StageBase* sb = new StageBase(); 6 return sb; 7 } 8 //... 9}; 10class GameStage1 : public StageBase{ 11 void draw(){ 12 //... 13 } 14 void update(){ 15 //... 16 } 17}; 18class GameStage2 : public StageBase{ 19 //GameStage1と同様、ステージ分クラスがある 20}; 21 22class StageManager{ 23 typedef enum stageName{ 24 TITLE, 25 STAGE01, 26 //... 27 } StageName; 28 29 std::map<StageName, StageBase*> mp; 30 31 void goToNextStage(StageName sn){ 32 mp.at(sn)->build();//問題の箇所 33 } 34};
##問題
まず純粋仮想関数がStageBaseに存在するとインスタンス化できないためコンパイル時にgoToNextStage関数でエラーが出ます。
しかし=0を取り除いてインスタンス化できるようにすると、
`vtable for SceneBase' に対する定義されていない参照です
などと出てリンカエラーになります。
##質問
そもそも、newしたいクラスをコンテナからうまく取り出してインスタンス化するというのがあまり良くない考えなのでしょうか?
if文やswitch文で、全GameStage分のnewするコードを書けば解決するとは思うのですが、ストラテジーパターンのように、うまく切り替えながら同じインターフェイスでnewできればすっきりすると思うのです。
なにとぞお知恵を貸してください。
回答1件
あなたの回答
tips
プレビュー