gpt4 book ai didi

c++ - 在类之间共享对象的好方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 15:59:01 26 4
gpt4 key购买 nike

在类层次结构中的多个类之间共享对象实例的好方法是什么?我有以下情况:

class texture_manager;

class world {
...
std::vector<object> objects_;
skybox skybox_;
}

我目前将 texture_manager 实现为单例,客户端从代码中的任何位置调用它的实例化方法。 texture_manager 需要被 objects_ vector 中的 object 使用,被 skybox_ 使用,并且可能被其他类使用好吧,它可能是也可能不是 world 类的一部分。当我试图限制在我的代码中使用单例时,您是否推荐这种方法的任何替代方法?想到的一种解决方案是将 texture_manager 引用作为参数传递给需要访问它的所有类的构造函数。谢谢。

最佳答案

该问题的一般答案是使用 ::std::shared_ptr。或者如果你没有那个,::std::tr1::shared_ptr,或者如果你没有那个,::boost::shared_ptr

在您的特定情况下,我会推荐几种不同的方法之一:

  1. 当然,一种可能性是 shared_ptr 方法。您基本上将指针传递给需要该对象的每个人,并且当他们不再需要它时它会自动销毁。尽管如果您的纹理管理器最终将指向指向它的对象的指针,那么您将创建一个引用循环,并且必须非常小心地处理它。

  2. 另一种可能性是在 main 中将其声明为局部变量,并将其作为指针或引用传递给需要它的每个人。在您的程序以这种方式完成之前,它不会消失,您不必担心管理生命周期。在这种情况下,裸指针或引用就可以了。

  3. 第三种可能性是一种模糊可接受的用法,类似于单例。这值得详细解释。

你创建了一个唯一的工作就是分发有用的东西的单例。它的一个关键特性是能够告诉它要将指针指向什么。它有点像全局可配置工厂。

这使您可以避免通常使用单例创建的巨大测试问题。只需告诉它在需要测试时分发一个指向 stub 对象的指针即可。

它还允许您摆脱访问控制/安全问题(是的,它们也会产生安全问题),出于同样的原因,单例代表这种问题。您可以暂时告诉它传递一个指向对象的指针,该对象不允许访问您将要执行的代码部分不需要访问的内容。这种思想通常被称为最小权限原则。

使用它的主要原因是它可以让您省去找出谁需要您的指针并将其交给他们的问题。这也是不使用它的主要原因,认为通过对你有好处。您还介绍了这样一种可能性,即由于您没有预料到的控制流,两个期望获得指向纹理管理器的相同指针的东西实际上获得了指向不同纹理管理器的指针,这基本上是导致您的草率思维的结果首先使用单例。最后,Singletons 太糟糕了,即使是对它们的这种更温和的使用也让我很痒。


就您个人而言,我会推荐方法 #2,只需在 main 中的堆栈上创建它,然后将指针传递到需要的地方。它会让你更仔细地考虑你的程序的结构,而且这种对象可能应该在你的整个程序的生命周期中都存在。

关于c++ - 在类之间共享对象的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com