在顺序很关键时初始化C ++组件的最佳实践?

米诺斯·纽(Minos Niu)

我正在使用C ++制作游戏引擎的原型。一个常见的任务是按照一定的顺序创建一系列对象,例如,对象B必须遵循对象A。必须强制执行该顺序,这不一定是因为类是相互依赖的,而是因为它们是与硬件相关的,因此必须遵循首先为A供电,然后为B供电的安全程序。

风格上的问题是如何确保这样的顺序。面向对象的设计没有依赖性,因为类B不需要任何关于类A的知识,反之亦然。因此,IoC并不是确保满足此类订单要求的过大手段。

确保这种顺序依赖性的C ++最佳实践是什么?

更新:初始化中的A-> B自然会要求破坏B->A。另外,A和B也应为单例,因为它们通常与硬件有关。

尼尔·弗里德曼

有许多合理的方法可以完成此任务。但是,还有一些未解决的问题。首先,如果必须在B之前构造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的朋友。然后,您可以使A和B成为C的公共成员,以便于访问他们的界面,或在不同程度上限制事物。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章