11

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

class texture_manager;

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

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

4

1 回答 1

11

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

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

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

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

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

你做一个单身人士,他唯一的工作就是为事情提供有用的指针。它的一个关键特性是能够告诉它分发指针到什么东西。它有点像一个全局可配置工厂。

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

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

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


就您个人而言,我会推荐方法#2,只需在堆栈中创建它main并传入指向所需位置的指针即可。它会让你更仔细地思考你的程序的结构,而且这种对象可能应该在你的整个程序的生命周期中都存在。

于 2011-11-19T22:28:25.697 回答