【问题标题】:how to create a class from an identifier?如何从标识符创建一个类?
【发布时间】:2019-02-16 10:07:31
【问题描述】:

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

假设我有一个名为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();
};

【问题讨论】:

  • 有什么理由不想为此使用多态性?
  • 也许不考虑返回正确的Spell 会有所帮助。让它执行action()(通过多态)而不担心执行它的子类怎么样?
  • @john 我不认为我曾经说过我不想使用多态性?我不是 100% 确定我知道你的意思泰德
  • FireBolt 实现了所有Spells 共有的东西——我选择称之为action()。每当说Spell的所有者要使用它时,只需调用它的action()即可。
  • 我觉得我们都有点困惑。看来您的实际问题是如何从 ID 创建一个类,这完全独立于多态性问题(尽管多态层次结构是您可能想要这样做的一个地方)。

标签: c++ inheritance polymorphism


【解决方案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(...);
    ...
}

【讨论】:

  • 我认为这行不通,因为 Art 无法像那样访问 FireBolt 的 ID。 Firebolt 是 Art 的子类,因此 Art 不继承 Firebolt ID 变量。
  • @CoolDudde 它将起作用,因为FireBolt::ID 既是公共的又是静态的。试试看。
  • 好的,所以你的问题是不想#include "FireBolt.h"。在这种情况下,只需将 ID 设为全局常量并将它们的声明与 Art 一起放在头文件中。
猜你喜欢
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多