如何避免让我的GameManager类成为大多数东西的朋友
How to avoid having my GameManager class be friend with most stuff?
我正在为一门电子游戏课程编写一款游戏(不幸的是这门课程没有教授任何内容),我在设计游戏实体和实际运行游戏的类之间的交互时遇到了麻烦。
我的问题大致可以归结为:假设一个实体有一个位置,它不应该能够直接修改它(而是必须等待游戏管理器运行一个游戏步骤),但它应该能够访问它,运行AI检查等等。
我的解决方案是创建一个与GameManager
为友的Position
类,并创建一个像这样的实体类
class Entity {
public:
Position & getPosition() { return pos_; }
private:
Position pos_;
};
因此管理器可以修改实体的位置,但其他类只能观察。然而,这种推理将适用于许多其他属性,并且由于实体类实际上派生为一系列子类,这些子类具有越来越多的属性,因此我将不得不将friend
属性几乎放在任何地方。
解决这个问题的更好方法是什么?
将某些类标识为好友而将其他类标识为非好友的想法不是一个好主意,原因有很多。这意味着,
这个类如何被使用也是这个类所关心的。
但这根本不是它所关心的。这个类,无论考虑的是什么类,都应该被设计成承担自己的责任。
现在,根据你的情况,首先你应该决定改变位置的动作/行为属于;它属于实体、实体管理器还是别的什么。例如,以下两种情况哪一种更有意义:
- 实体将位置从x1更改为x2。
- 实体管理器将实体位置从x1更改为x2。
假设你决定这个行为真的属于实体,而不是实体管理器(情况1)。在这种情况下,正如@bengoesboom在评论中指出的那样,它应该提供一个setter,类的用户可以使用它来改变它的位置。
现在,如果您认为这个类可能以不希望的方式使用,那么您应该在这个类中实施约束和业务规则。例如(只是一个简单的例子),如果您希望在操作中只允许特定范围的值。检查输入,如果不在范围内,则抛出异常。
一旦你妥善处理了规则和约束,那么你就不用关心谁将使用这个类了
- 一位朋友将模板函数缩写为clang和gcc
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 班级的朋友是不可接近的
- 与朋友声明相反
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 类似虚拟的朋友功能?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 在朋友类中使用模板
- 访问私人成员而不使用朋友类
- 类和朋友在它们之间起作用
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- "朋友"成员函数和 GCC 与 Clang
- 朋友声明的复杂范围界定规则有什么意义?
- C++:让函数成为多个类的朋友?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 朋友,前瞻宣言,C++
- 大多数基本类型的高效二进制序列化
- 推断大多数模板对象的参数,但在调用模板函数时对其他对象显式
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 如何避免让我的GameManager类成为大多数东西的朋友