C ++互相依赖

时间:2014-02-03 18:47:45

标签: c++ class include structure

我正在用C ++写一个纸牌游戏。我有一个播放器类,它处理动作(即选择要放置的牌)。如果播放器是人类,它将使用 GUI类,如果它是计算机,它将使用 AI类

为了让AI课程做出决定,它需要了解游戏过程中每个玩家变化的一些事情,例如手头的牌数。现在我在AI类的向量中存储每个玩家的玩家指针。

然而,这导致了我的问题,AI类需要#include Player类,而玩家类需要#include AI类。

也许解决方案不是如何处理#includes,而是构建类的更好方法?

2 个答案:

答案 0 :(得分:1)

我猜玩家和AI类都有这种纸牌游戏的常用方法(获得卡,放卡,随机播放,下注,全部...),这些方法可以从基类继承 CardPlayer 或者在运行时使用接口编写(参见Strategy Pattern)。

要将Human Player类与GUI连接,请创建合适的界面,例如:

typedef struct PlayerInfoStruct {
    ---player info variables here---
};

class IGUIPlayer {
    virtual PlayerInfoStruct GetPlayerInfo(...) = 0;
    ---other methods exclusive to the GUI-player interaction here---
};

并在HumanPlayer中实现继承它的接口:

class HumanPlayer : public CardPlayer, public IGUIPlayer {
    PlayerInfoStruct GetPlayerInfo() {---method---}
    ---other methods here---
}

并在GUI中使用其界面指向每个人类玩家:

---somewhere in your GUI Class---
IGUIPlayer* humanplayer1 = <pointer to HumanPlayer>;

有了它,GUI类依赖于IGUIPlayer。 HumanPlayer依赖于IGUIPlayer和CardPlayer。 AIPlayer仅依赖于CardPlayer。没有圆形的东西!

使用界面意味着您可以随时在GUI中提供AI玩家的信息,只需将 IGUIPlayer 继承到AIPlayer并实现纯虚拟方法,而无需修改GUI位。我花了一些时间来适应这个(我仍然继续学习),但我无法抗拒它的强大力量。

答案 1 :(得分:0)

有时,为了使用它,没有必要包含类的标题。例如,如果您只使用指针或类的引用,则可以向前声明它:而不是

#include "player.h"
class AI
{
  std::vector<player *> pl;
};

你可以写

class player;
class AI
{
  std::vector<player *> pl;
};