c++ - 如何避免让我的 GameManager 类与大多数东西成为 friend ?

标签 c++ oop

我正在为一门视频游戏类(class)编写游戏(不幸的是,这门课什么也没教),我在设计游戏实体与实际运行游戏的类之间的交互时遇到了问题。

我的问题几乎可以简化为:假设一个实体有一个位置,它不应该能够直接修改它(而是必须等待游戏管理器运行游戏步骤),但它应该能够访问它,运行 AI 检查等等。

我的解决方案是创建一个 Position 类,它是 GameManager 的友元类,并创建一个这样的实体类

class Entity {
    public:
        Position & getPosition() { return pos_; }
    private:
        Position pos_;
};

因此,管理器将能够修改实体的位置,而其他类只能观察。然而,这个推理适用于许多其他属性,并且由于实体类实际上派生为一系列子类,这些子类具有越来越多的属性,我几乎不得不将 friend 属性无处不在。

解决这个问题的更好方法是什么?

最佳答案

出于多种原因,将某些类标识为 friend 而将某些其他类标识为非 friend 的想法并不是一个好主意。这意味着,

这个类怎么用也是这个类关心的问题。

但这根本不是它关心的问题。这个类,不管是什么类,都应该被设计成做它自己的责任。

现在,对于你的情况,首先你应该决定改变位置的 Action /行为属于哪里;它属于实体、实体管理器还是其他东西。例如,这两种情况哪个更有意义:

  1. 实体将其位置从 x1 更改为 x2。
  2. 实体管理器将实体的位置从 x1 更改为 x2。

假设您确定此行为确实属于实体,而不是实体管理器(案例 1)。在这种情况下,正如@bengoesboom 在评论中指出的那样,它应该提供一个 setter,该类的用户可以使用它来更改其位置。

现在,如果您认为此类可能会以不希望的方式使用,那么您应该在此类中实现约束和业务规则。例如(只是一个简单的例子),如果你想在操作中只允许特定范围的值。您检查输入,如果它不在范围内,则抛出异常。

一旦您正确地处理了规则和约束,那么您就不会关心谁将使用这个类了。

关于c++ - 如何避免让我的 GameManager 类与大多数东西成为 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16946785/

相关文章:

oop - 清洁架构 : UseCase Output Port

c++ - 获取窗口样式

c++ - OpenGL : How to use glMapBuffer with Qt?

c++ - GetProcAddress 与 __declspec(dllimport)

c++ - 最大字符限制条件和最小字符放置条件

Python将自身更改为继承类

c++ - 如何在图像中绘制一个矩形,只有当鼠标移动到opencv中的特定位置时才会显示?

python - 如何测试从某个抽象类继承的对象类

c++ - 如何使用包含内部类的类的实例有效地访问内部类的成员?

c# - 我们什么时候需要使用代理类?