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

时间:2011-11-19 22:24:11

标签: c++ singleton global-variables globals

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

class texture_manager;

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

我目前将texture_manager实现为单例,客户端从代码中的任何位置调用其实例化方法。 texture_manager向量object中的objects_需要使用skybox_world可能需要texture_manager使用,{{1}}可能也可能属于{{1}} 1}}类。 由于我试图在我的代码中限制单例的使用,您是否建议使用此方法的替代方法?我想到的一个解决方案是将{{1}}引用作为参数传递给需要访问它的所有类的构造函数。感谢。

1 个答案:

答案 0 :(得分:11)

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

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

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

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

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

  4. 你做一个单身人士,唯一的工作就是分发有用的指针。它具有的一个关键特性是能够告诉它将指针分配给什么。它有点像全球可配置的工厂。

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

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

    使用它的主要原因是它可以节省你找出谁需要你的指针并将它交给他们的问题。这也是不使用它的主要原因,认为通过对你有好处。你还介绍了两种预期获得指向纹理管理器的指针实际上可以获得指向不同纹理管理器的指针的可能性,这是因为你没有预料到的控制流,这基本上是由于草率思维导致你首先使用Singleton。最后,单身人士非常可怕,即使这种使用它们更加温和,也会让我发痒。


    就个人而言,在你的情况下,我会建议方法#2,只需在main的堆栈上创建它,然后传入一个指向所需位置的指针。它会让你更仔细地思考你的程序结构,这种对象应该适用于整个程序的生命周期。