初始化构造函数中的引用

时间:2013-07-27 14:35:03

标签: c++ pointers reference constructor

我正在开发一个游戏项目,我的队友有一定的方法来解决我们的参考问题,并且效果很好,除非游戏很大,我们最终会得到大量的构造函数。

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个引用怎么办?

有没有办法让这种语法更简单,或者我们做错了吗?有没有更好的方法来引用播放器类之外的变量?

重要 以上只是一个例子,写得不好。我不仅拥有武器和盔甲。我有很多课程。我有一个开发人员控制台参考,我有盔甲参考,项目,我有对调试类,记录器类的引用,并且列表继续。向量对我没有帮助。抱歉这个可怜的例子。

3 个答案:

答案 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 { ... }

作为旁注,我之前在自己的游戏中使用了上述等级。但是在我的下一个游戏中(当和如果我得到那么远)我可能会使用另一种模式,其中类表示行为。例如,swordequipable,它是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*>&);
}