2016-12-22 22 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

你是否試圖根據隨機數產生一個隨機敵人?意味着只有兩種類型的敵人? – 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