【发布时间】:2017-05-08 14:16:10
【问题描述】:
抱歉标题定义错误。我的意思:
(顺便说一句,我正在开发游戏引擎,A 是 场景,B 是 游戏对象,C 是 组件 )
我有 3 个班级:A、B、C
- A 包含 B,B 包含 C。
- A 和 B 相互引用。
- B 和 C 相互引用。
(A在B的头文件中前向声明,并包含在B的实现中)
就像这样:A B C
我的情况是这样的:
我想从 C 中使用 A 的方法。(比如告诉主容器添加另一个 B 等)
~我想做一个可重用的函数,它调用父对象的父对象的方法。
例如在 C 的派生类中,我不必关心 C 如何到达 A,我只需调用 C 的 Reach-A-and-do-something 方法即可。
我的问题是我应该使用哪一个以及为什么(或者是否有更好的?):
在 C 中:GetB().GetA().DoSomething()
C 的 DoSomething() 调用 B 的 DoSomething(),而 B 的 DoSomething() 又调用 A 的 DoSomething。
第一个对我来说看起来更好,但在 C 的实现中,我只包含 B 的标头,其中 A 只是前向声明。所以如果不将 A 明确包含在 C 中,我就不能使用 A 的方法。(这是一种不好的做法,还是应该只包含它?)
第二个开销很大。如果我想使用 A 的 XY 方法,我必须在 B 中创建一个调用 A 的 XY 的 XY 方法,我必须在 C 中创建一个调用 B 的 XY 的 XY 方法。
所以我不知道我应该如何从较低的元素到达层次结构中的较高元素。
什么是最好的解决方案?
【问题讨论】:
-
在C文件中添加A的头文件会不会导致冲突?
-
GetB().GetA().DoSomething()似乎更好。您可以在 C 中包含 A,只需确保您的定义和声明是分开和包含的。另一种选择可能是使用std::functional,然后使用来自A 的函数初始化B,并将其复制到C 中的std::functional变量,这样C 就可以调用my_std_functional(),它在A 中执行某些操作。 -
它工作正常。你能否给我更多关于“定义和声明被分离和包含”的细节?如果每个班级都在不同的范围内,那没问题,不是吗?
-
@Muscampester 当我只想使用一个A方法并且A的标题很大时,第二个更好吗?或者我应该总是避免第二个?
-
我会说这取决于你。两者都是可行的。也许通过您尝试做的最小示例,提供更详细的答案会更容易。
标签: c++ architecture game-engine hierarchy