2016-12-22 16 views
1

私はポケモンバトルシミュレータを作成していますが、配列の要素を使ってクラスを呼び出すことができるかどうかを知りたいと思います。C++配列の要素を使ってクラスを呼び出す方法

#include <iostream> 
#include <time.h> 
#include <string> 

using std::cout; 
using std::endl; 
using std::string; 

string PokémonArray[] = { "Pikachu","Pidgey" }; 

class Pokémon { 
public: 
    string basic_attack; 
    int basic_attack_dmg; 

    string getBasicAttackName() { return basic_attack; } 

Pokémon() { ; } 
}; 

class Pikachu : public Pokémon { 
public: 
    Pikachu(){ basic_attack = "Whatever"; } 
}; 

int main(){ 
int random_num; 
string randEnemy; 

srand(TIME(NULL)); 
random_num = rand() % 2; //Generates a random number between 0 and 1 

randEnemy = PokémonArray[random_num]; //Sets randEnemy to be equal to the element 0 or 1 (generated above) of the array 

(randEnemy) enemy; //Try to create the object 'enemy' calling a class using an element of the array 

} 

同じ名前の配列の要素を使用してクラスを呼び出すにはどうすればよいですか?

+4

なぜポケモンの配列の代わりに文字列の配列を作るのですか? – user2393256

+0

乱数に基づいてランダムな敵を召喚しようとしていますか?意味は敵の唯一の2つのタイプですか? – Zebrafish

答えて

1

あなたの質問に直接答えることができますが、if/elseステートメントがたくさん必要になるため、多態性のベースを使用する必要があります。

Pokemon* pokemon = nullptr; 
if(randEnemy == "Pikachu") 
    pokemon = new Pikachu; 
else if (randEnemy == "Raichu") 
    pokemon = new Raichu; 
else if... 

このパターンは、「ファクトリメソッド」または「仮想コンストラクタ」と呼ばれます。

0

あなたのアレイにポケモンを保存することができます。

Pokemon PokémonArray[152]; 

そして、必要に応じて機能を直接呼び出してください。

randEnemy = PokémonArray[random_num]; 
randEnemy.basicAttack(); 
1

Pokemonを直接配列に格納できますが、Pokemonインスタンスがポリモーフィックであるように、他の応答が指定するほど単純ではありません。したがって、格納する必要があるのはPokemonインスタンスへのポインタです。

最高のスマートポインタ(自動破壊用)。用途に応じて、それがいずれかになります:

std::vector<std::unique_ptr<Pokemon> > PokemonArray; 

または

std::vector<std::shared_ptr<Pokemon> > PokemonArray; 

(ポインタのインスタンスは、複数の所有者が所有することが可能かどうかによって異なります)

または単純な配列が、私は一般的にstd::vectorが好きです。

関連する問題