Cool Dudde
Cool Dudde

Reputation: 33

how to create a class from an identifier?

the title might be a bit misleading, but I want to give some instance of a class an instance of a different class through polymorphism. I think that may have been even more misleading so I'll give an example;

Say I have a class called Spell, that is a parent class to the class Firebolt. I want another class, say Character, to be able to have the spell, 'Firebolt', in an its memory without ever having to #include the files for 'Firebolt'.

Now, I can think of a way that prior games have done this before. By giving each spell (or whatever else specific class type) a static const string ID or name and in spell having some function that can access this ID/name and return a new Firebolt() if they are the same.

This sounds pretty good actually, the problem I'm having is I don't know how to code this. I'm not sure how I can access these ID's from the parent class, and I'm not sure how to make a virtual function that will actually return the correct Spell. Any help would be amazing. I'll also provide the actual class code I'm working with here in case it might help you guys to answer, or someone with a similar problem to solve it.

The parent class;

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;
};

The subclass;

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();
};

Upvotes: 0

Views: 105

Answers (1)

john
john

Reputation: 87957

All you need to do is make your FireBolt::ID public.

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

Art* Art::findArt(const std::string& ID)
{
    if (ID == FireBolt::ID)
        return new FireBolt(...);
    ...
}

Upvotes: 1

Related Questions