class Item
{
// public:
// virtual int GetDamage() const { return -1; }
};
class Weapon : public Item
{
public:
Weapon(int InDamage)
:Damage(InDamage)
{
}
int GetDamage() const { return Damage; }
// virtual int GetDamage() const override { return Damage; }
private:
int Damage = 0;
};
class Armor : public Item
{
public:
Armor(int InDefence)
:Defence(InDefence)
{
}
int GetDefence() const { return Defence; }
private:
int Defence = 0;
};
class ItemManager
{
public:
ItemManager()
{
ItemMap.insert
({
{"Weapon", new Weapon(50)},
{"Armor", new Armor(100)},
});
}
Item* GetItem(const std::string& ItemName) const
{
const auto It = ItemMap.find(ItemName);
return It->second;
}
private:
std::map<std::string, Item*> ItemMap;
};
int main()
{
ItemManager Manager;
Item* ItemInst = Manager.GetItem("Weapon");
// const int Damage = ItemInst->GetDamage()
// Weapon* WeaponInst = dynamic_cast<Weapon*>(ItemInst);
// std::cout << WeaponInst->GetDamage() << std::endl;
return 0;
}
this is code sample.
solutions All I have, to get weapon damage from Item are
- use dynamic_cast to cast item to weapon.
- add GetDamage virtual function in Item class, and override this even though armor doesn't need.
I'm really uncomfortable with these solutions.
it's like I'm trying to destroy 'SOLID design Principles'.
I'm sure, there is better solution just I don't know.
please, teach me the best code design.
thanks in advance.