如何从标识符创建一个类?

时间:2019-02-16 10:07:31

标签: c++ inheritance polymorphism

标题可能有点误导,但我想通过多态性为类的某个实例提供不同类的实例。我认为这可能会进一步引起误解,所以我举个例子;

说我有一个名为Spell的类,它是类Firebolt的父类。我希望另一个类(例如Character)能够在其内存中包含咒语“ Firebolt”,而不必#include“ Firebolt”的文件。

现在,我可以想到以前的游戏以前已经做到的方式。通过为每个咒语(或任何其他特定类类型)赋予一个静态const字符串ID或名称,并在咒语中具有一些可以访问此ID /名称的功能,如果它们相同,则returnnew 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();
};

1 个答案:

答案 0 :(得分:1)

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