2011-11-19 82 views
9

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

class texture_manager; 

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

我目前实施texture_manager作为一个单身,和客户端调用它的实例化方法从代码的任何地方。 texture_manager需要由objects在objects_向量中使用,由skybox_使用,并且可能由其他类别使用,其可能也可能不属于world类别的一部分。 由于我试图限制在我的代码中使用singleton,你建议使用这种方法的替代方法吗?想到的一个解决方案是将texture_manager引用作为参数传递给需要访问它的所有类的构造函数。谢谢。

+1

为什么不直接声明你的texture_manager的全局实例?如果处理正确,全局并不是邪恶的。而且它们在线程化环境中的危险性不及任何其他实例传递给多个客户端...... – Mordachai

回答

10

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

你的具体情况,我建议的几种不同的方法之一:

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

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

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

你做一个单身人士只是工作是分发有用的指针。它具有的一个关键特性是能够告诉它将指针指向什么东西。这有点像全球可配置的工厂。

这使您可以摆脱一般单身人士创造的巨大测试问题。只要告诉它在需要测试时就发出一个指向存根对象的指针。

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

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


个人而言,你的情况,我建议的方法#2,只是main创建它在堆栈上,并传递一个指针,无论它的需要。它会让你更仔细地考虑你的程序结构,而这种对象应该可以适用于整个程序的整个生命周期。

+2

我认为在这里使用某种共享指针只是一种围绕棘手(但重要)讨论谁实际拥有'texture_manager'对象。一旦没有人再参考它,它是否真的会被破坏? –

+1

我想过这个,但是将一个shared_ptr传递给类层次结构看起来很麻烦,我希望找到一个替代解决方案。或者这不是你想到的? –

+0

@FrerichRaabe:是的,我只是把它作为'标准建议'的第一次剪辑。这就是我立即想到的问题。但我更深入地分析了它,并更新了我的答案。 – Omnifarious

相关问题