Как создать класс из идентификатора? - PullRequest
0 голосов
/ 16 февраля 2019

заголовок может быть немного вводящим в заблуждение, но я хочу дать некоторому экземпляру класса экземпляр другого класса посредством полиморфизма.Я думаю, что это могло быть еще более обманчивым, поэтому я приведу пример:

Скажем, у меня есть класс с именем Spell, который является родительским классом для класса Firebolt.Я хочу, чтобы другой класс, скажем, Character, имел возможность хранить заклинание «Firebolt» в своей памяти без необходимости включать файлы «Firebolt» в #.

Теперь я могу придумать, как предыдущие игры делали это раньше.Присваивая каждому заклинанию (или какому-либо другому определенному типу класса) статический идентификатор или имя строки const, и в заклинании есть некоторая функция, которая может получить доступ к этому идентификатору / имени и return a new Firebolt(), если они одинаковы.

Это звучит довольно неплохо, проблема в том, что я не знаю, как это кодировать.Я не уверен, как мне получить доступ к этим идентификаторам из родительского класса, и я не уверен, как создать виртуальную функцию, которая на самом деле будет возвращать правильный Spell.Любая помощь будет потрясающей.Я также предоставлю фактический код класса, с которым я работаю здесь, на случай, если он может помочь вам, ребята, ответить или кому-то с подобной проблемой, чтобы решить ее.

Родительский класс;

class Art {
    std::string name;
    int EPCost;
    int castTime;
    int AoESize;

public:
    Art(std::string n, int cp, int ct, int as):name(n), EPCost(cp), castTime(ct), AoESize(as) {}

    virtual ~Art() {}

    static Art* findArt(std::string ID);

    int getAoESize() {return AoESize;}

    std::string getName() {return name;}
    int getEPCost() {return EPCost;}

    virtual int getBaseDamage() = 0;
};

Подкласс;

class FireBolt:public Art {
    static const std::string name;
    static const int EPCost;
    static const int castTime;
    static const int AoESize;
    static const std::string ID;

public:
    FireBolt():Art(name, EPCost, castTime, AoESize) {}

    ~FireBolt() {}

    int getBaseDamage();
};

1 Ответ

0 голосов
/ 16 февраля 2019

Все, что вам нужно сделать, это сделать вашу FireBolt::ID публичной.

class FireBolt:public Art {
public:
    static const std::string ID;
    ...
};

Art* Art::findArt(const std::string& ID)
{
    if (ID == FireBolt::ID)
        return new FireBolt(...);
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...