gpt4 book ai didi

c++ - 在 C++ 中删除类之间的循环依赖

转载 作者:太空狗 更新时间:2023-10-29 20:01:44 26 4
gpt4 key购买 nike

假设我们正在制作一款两人纸牌游戏,并且我们有名为 Game、Player 和 Card 的类。游戏包含指向两个玩家的指针,并为玩家提供一个界面。 Player 由玩家的健康状况和他们的魔法以及他们的手牌 vector 组成。 Card 是一个抽象类。每张牌都需要魔法来玩,并且可以玩。

问题在于每张牌在打出时都可以通过多种方式改变游戏状态。例如,我们可以有一张使玩家的生命值翻倍的卡片,一张使敌方玩家中毒两回合的卡片,一张摧毁棋盘上所有随从的卡片,一张为棋盘上已有的每个随从创建拷贝的卡片,等等. 可能性真的是无穷无尽的。我能看到的唯一解决方案是在每张卡片中有一个指向 Game 的指针,但这似乎相当不雅。

还有其他解决办法吗?

最佳答案

你的基本想法是正确的,但你应该进一步增强它以保持高水平的抽象和封装。

所以在您的示例中,假设您有一个 Card 类,它是现有类的一个实例。

你可以做的第一件事是将卡的效果从卡本身中分离出来,例如:

class CardEffect {
// TODO ...
};

class Card {
private:
const CardEffect* effect;
};

所以现在卡片本身不需要了解游戏的任何信息。但是让我们更深入地了解一下:CardEffect 不需要知道 Game 类的每个细节,它需要能够做的是将效果应用到游戏中.这可以通过为效果提供一个单独的界面来完成,该界面只公开应用效果所需的内容,所以像这样。

class GameInterface {
public:
virtual const std::vector<Player*>& getPlayers() = 0;

virtual damagePlayer(Player* player, int amount) = 0;
virtual applyPeriodicDamage(Player* player, int turns, int amount) = 0

..
};

class CardEffect {
virtual applyEffect(GameInterface* interface) = 0;
};

class Card {
private:
const CardEffect* effect;
};

现在这只是一个示例,对于您的问题没有明确的解决方案,因为每个特定场景都不同并且有不同的要求,它只是给您一个基本的想法,让您了解如何在保持代码优雅和封装的同时保持它足够的描述性以便于管理。

关于c++ - 在 C++ 中删除类之间的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com