我正在开发一个游戏项目,我的队友有一定的方法来解决我们的参考问题,并且效果很好,除非游戏很大,我们最终会得到大量的构造函数。
class Player
{
private:
Weapon *w1, *w2, *w3;
Armor *a1, *a2;
public:
Player(Weapon *w1, Weapon *w2, ...) : w1(w1), w2(w2), ...;
}
然后我的构造函数is Player(w1, w2, w3, ...);
令人不安,如果玩家类有100个引用怎么办?
有没有办法让这种语法更简单,或者我们做错了吗?有没有更好的方法来引用播放器类之外的变量?
重要 以上只是一个例子,写得不好。我不仅拥有武器和盔甲。我有很多课程。我有一个开发人员控制台参考,我有盔甲参考,项目,我有对调试类,记录器类的引用,并且列表继续。向量对我没有帮助。抱歉这个可怜的例子。
答案 0 :(得分:1)
为什么不使用vectors
?
std::vector<Weapon *> W;
std::vector<Armor *> A;
答案 1 :(得分:1)
如果你使用继承,你确实可以将它全部放在一个向量中。
对于一个以幻想为主题的游戏(我假设你正在写作),它可能是这样的:
// 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 { ... }
作为旁注,我之前在自己的游戏中使用了上述等级。但是在我的下一个游戏中(当和如果我得到那么远)我可能会使用另一种模式,其中类表示行为。例如,sword
是equipable
,它是damage_inflicter
,它是takeable
等。这意味着更复杂的继承层次结构,具有更多的多重继承,并且可能会使用RTTI更多。但从好的方面来看,它有望更灵活。
答案 2 :(得分:0)
尝试使用向量:
,而不是使用固定数量的指向少数类型的指针class Player
{
private:
std::vector<Weapon*> weapons;
std::vector<Armor*> armors;
public:
Player(const std::vector<Weapon*>&, const std::vector<Armor*>&);
}