首页 > 解决方案 > 如何从标识符创建一个类?

问题描述

标题可能有点误导,但我想通过多态性给一个类的一些实例一个不同类的实例。我认为这可能更具误导性,所以我举个例子;

假设我有一个名为的类Spell,即该类的父类Firebolt。我希望另一个班级,例如Character,能够在其记忆中拥有咒语“Firebolt”,而不必#include 'Firebolt' 的文件。

现在,我可以想到以前的游戏曾经这样做过的一种方式。通过给每个拼写(或任何其他特定的类类型)一个静态常量字符串 ID 或名称,并在拼写中具有一些可以访问此 ID/名称return的函数以及new Firebolt()它们是否相同。

实际上这听起来不错,我遇到的问题是我不知道如何编码。我不确定如何从父类访问这些 ID,也不确定如何创建一个实际返回正确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();
};

标签: c++inheritancepolymorphism

解决方案


您需要做的就是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(...);
    ...
}

推荐阅读