2016-12-22 1 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을 선호합니다.

관련 문제