首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++互类依赖

C++互类依赖
EN

Stack Overflow用户
提问于 2014-02-03 18:47:45
回答 2查看 917关注 0票数 0

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

为了让AI类做出决定,它需要了解每个玩家在游戏中的变化情况,例如手上的牌数。现在,我在AI类的向量中为每个玩家存储一个播放器指针。

然而,这导致了我的问题,AI类需要#包括Player类,而player类需要#包含AI类。

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

EN

回答 2

Stack Overflow用户

发布于 2014-02-03 19:20:18

我想玩家和AI类对于那个纸牌游戏都有共同的方法(得到牌,放牌,洗牌,下注,全部都在.)它可以从基类CardPlayer继承,也可以在运行时使用接口进行组合(参见战略模式)。

要将Human类与GUI接口,请创建一个合适的界面,例如:

代码语言:javascript
复制
typedef struct PlayerInfoStruct {
    ---player info variables here---
};

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

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

代码语言:javascript
复制
class HumanPlayer : public CardPlayer, public IGUIPlayer {
    PlayerInfoStruct GetPlayerInfo() {---method---}
    ---other methods here---
}

在您的GUI中,您使用它的界面指向每个人类玩家:

代码语言:javascript
复制
---somewhere in your GUI Class---
IGUIPlayer* humanplayer1 = <pointer to HumanPlayer>;

在这种情况下,GUI类依赖于IGUIPlayer。HumanPlayer同时依赖于IGUIPlayer和CardPlayer。AIPlayer只依赖于CardPlayer。不要循环的东西!

使用界面意味着,您可以随时在GUI中提供AI玩家的信息,只需将IGUIPlayer继承到AIPlayer并实现纯虚拟方法,而无需修改GUI。我花了一些时间才习惯了这一点(我还在继续学习),但我无法抗拒它的潜移默化。

票数 1
EN

Stack Overflow用户

发布于 2014-02-03 18:53:02

有时,为了使用类,不需要包含类的标头。例如,如果只使用指针或对类的引用,则可以转发-声明它:而不是

代码语言:javascript
复制
#include "player.h"
class AI
{
  std::vector<player *> pl;
};

你可以写

代码语言:javascript
复制
class player;
class AI
{
  std::vector<player *> pl;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21535239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档