2017-09-20 11 views
0

私は学習中に小さなプロジェクトを開始しました。基本的に、私がしようとしているのは、私が新しいものを学ぶときに構築しようとしている小さな「ゲーム」です。サブクラスオブジェクトを格納できるスーパークラス型のベクトルを作成する

ここに簡単な説明と私の問題があります。

基本的に、選手の選択に基づいてさまざまなヒーロータイプをプレーヤに割り当てたいと思います。

これまでHPパラメータのみで基本クラス「Hero」を作成しました。その後、私はHero、HeroType1、HeroType2の2つの派生クラスを作成しました。これらのクラスは特定の能力を持ちます。

std::vector<Hero*> Heroesにさまざまなヒーロータイプを保存することを決めました。基本的には、initializeHeroes関数を呼び出すことで "ゲーム"を開始します。これは、プレイヤーの選択に応じて、NewHero1またはNewHero2型の新しいオブジェクトを作成し、前述のベクトルを格納します。つまり、これまでに何を試しても、派生メンバー関数を後で使いたいときにはアクセスできず、Heroクラスのものにしかアクセスできません。

グローバル変数player1、player2を宣言し、プレイヤーがHeroTypeを選択した後に割り当てることをお勧めします。しかし、コンパイルする前にデータ型を知っていなければならないので、これを行うことはできません。申し訳ありませんが、これは愚かで基本的な質問である場合、私の知識はまだ非常に限られていると私はここでいくつかのヒントを求めている理由です。

私はこれにどのようにアプローチすればよいか質問したいと思いますが、それは非常に単純な問題ですが、私はまだ初心者であり、これを解決する最善の方法を見つけようとしています。前もって感謝します。

+1

解決策の1つとして、訪問者パターンを参照します。それ以外は、あなたの質問は、SOの質問形式によく合いません。 – StoryTeller

答えて

0

あなたはstd::vector<Hero*> Heroesから要素からメンバ関数を呼び出すしたいとあなたがHERO2型にこの要素がポイントということ何とかわかっている場合は、あなたが新しい一時変数Hero2 * tmpPtrを作成し、要素にこの変数を設定することができますそのメンバー機能を呼び出したい(tmpPtr = Heroes[i])。次に、tmpPtr->hero2Memberfuncion()のようなメンバー関数を呼び出すことができるはずです。

全コード:

#include <iostream> 
#include <vector> 

class SomeClass 
{ 
public: 
    void a() { 
     std::cout << "a" << std::endl; 
    } 
}; 

class AnotherClass : public SomeClass 
{ 
public: 
    void b() { 
     std::cout << "b" << std::endl; 
    } 
}; 

void main() { 
    std::vector<SomeClass *> vec; 
    AnotherClass v; 
    vec.push_back(&v); 

    AnotherClass * tmpPtr = (AnotherClass *)vec[0]; 
    tmpPtr->b(); //Output: "b" 
} 

しかしあなたは全体のベクトルを通って、すべての要素が同じ名前を持つが、その関数の本体は何Hero-に異なりmemberfunctionを実行するための一例のforループしたい場合要素のポイントを入力し、次に仮想関数を使用することができます。例:

#include <iostream> 
#include <vector> 

class SomeClass 
{ 
public: 
    virtual void a() { 
     std::cout << "from SomeClass" << std::endl; 
    } 
}; 

class AnotherClass : public SomeClass 
{ 
public: 
    void a() { 
     std::cout << "from AnotherClass" << std::endl; 
    } 
}; 

void main() { 
    std::vector<SomeClass *> vec; 

    AnotherClass v1; 
    vec.push_back(&v1); 
    vec[0]->a(); //Output: "from AnotherClass" 

    SomeClass v2; 
    vec.push_back(&v2); 
    vec[1]->a(); //Output: "from SomeClass" 
} 
関連する問題