【问题标题】:How to access parent object's parent from an object efficiently?如何有效地从对象访问父对象的父对象?
【发布时间】: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


【解决方案1】:

在 C 中:GetB().GetA().DoSomething()

C 的 DoSomething() 调用 B 的 DoSomething() 调用 A 的 DoSomething。

我认为两者都是错误的,因为从架构的角度来看,这种方法会在类之间产生强耦合。考虑使用事件调度程序,它为您的逻辑实现Observer 模式。让组件相互发送事件并对其做出反应。

我不确定在你的情况下这将如何发挥性能,但我强烈建议不要使用 premature optimization,除非它很明显。

【讨论】:

  • 目前我只能实现这一点,将所有其他游戏对象存储在每个游戏对象中。所以每个游戏对象都可以到达(通知)每个游戏对象。但在我的架构中,游戏对象存储在一个地方(场景),这就是游戏对象访问场景的原因。 (因此通过访问场景,他们可以访问其他游戏对象,并通知他们。)
猜你喜欢
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多