在订单关键时初始化C ++组件的最佳做法?

时间:2014-07-31 05:24:05

标签: c++ dependency-management

我使用C ++来构建游戏引擎的原型。一个常见的任务是按照特定顺序创建一系列对象,比如对象B必须跟随对象A.必须强制执行顺序,因为类是相互依赖的,但是因为它们与硬件相关,所以它必须遵循首先启动A和随后B的安全程序。

风格问题是我如何确保这样的订单。在面向对象设计方面没有依赖性,因为B类不需要任何A类知识,反之亦然。因此IoC对于确保此类订单要求并不过分。

确保此类订单依赖的C ++最佳实践是什么?

更新:A - > B在初始化时自然会要求B - >一个破坏。 A和B也应该是单例,因为它们通常与硬件有关。

1 个答案:

答案 0 :(得分:2)

有许多合理的方法可以完成这项任务。但是有一些未解决的问题。首先,如果A必须在B之前构造,那么必须在A之前销毁B吗?第二,你能拥有这个对象的倍数吗?如果是这样,是否有一些参数必须匹配或类似的东西?例如。假设A和B的构造函数都采用int,那么在构造B(1)之前必须构造A(1)。

我认为绝对最安全的方法是将A和B嵌入到另一个类中,称为C.它是最安全的,因为标准保证:1)它们将按类中的声明顺序构造,并且2 )它们将以相反的顺序被破坏。请注意,与使用工厂的许多潜在实现不同,这也是自动异常安全的。

根据A和B的构造函数的细节,让C直接保存A和B对象可能更有意义,或者可能更有意义地使用作用域指针。我会确保A和B具有私有或受保护的析构函数(取决于您是否计划允许继承),并将C声明为A和B的朋友。然后,您可以创建C的A和B公共成员以便于访问他们的界面,或不同程度的限制。

编辑:A和B应该有私有析构函数,以防止用户意外删除。例如,如果您决定将C实现为具有指向A和B的作用域指针,那么您可以从范围指针获取原始指针并在其上调用delete。更好的是在编译时失败。另外,如果你想让A和B成为单身,我建议的模式很有用。由于A和B都有私有构造函数,所以你可以将C实现为单例,这将满足这一要求。