如果您使用继承,您确实可以将它们全部放在一个向量中。
对于一个幻想主题的游戏(我假设你正在编写)它可能是这样的:
// The base object, contains common attributes
class Object { ... };
// The item class
class Item : public Object { ... };
class Weapon : public Item { ... };
class Sword : public Weapon { ... };
class Clothing : public Item { ... }
class Armour : public Clothing { ... };
那么对于所有设备,一个向量就足够了:
std::vector<std::shared_ptr<Item>> inventory;
对于磨损的东西,你可以有单独的变量,比如
std::shared_ptr<Weapon> wielded;
std::shared_ptr<Clothing> head; // Helmets, hats, etc.
或者为装备的东西使用地图:
std::unordered_map<std::string, std::shared_ptr<Item>> equipped;
然后你可以使用例如
equipped["wielded"]
获得持有的物品。
为了完整起见,上面类树中的一些其他可能的类可能是:
class Character : public Object { ... }
class Player : public Character { ... }
class Monster : public Character { ... }
class Dragon : public Monster { ... }
class RedDragon : public Dragon { ... }
class TheUltimateBossDragon : public RedDragon { ... }
附带说明一下,我以前在自己的游戏中使用过像上面这样的层次结构。然而,在我的下一场比赛中(当我走到那一步时)我可能会使用另一种模式,其中类表示行为。例如, a sword
is equipable
, it's a damage_inflicter
, it'stakeable
等。这意味着更复杂的继承层次结构,具有更多的多重继承,并且可能会更多地使用 RTTI。但从好的方面来说,它有望更加灵活。