Dan*_*tor 10 c++ singleton global-variables globals
在类层次结构中的几个类之间共享对象实例的好方法是什么?我有以下情况:
class texture_manager;
class world {
...
std::vector<object> objects_;
skybox skybox_;
}
Run Code Online (Sandbox Code Playgroud)
我目前将texture_manager实现为单例,客户端从代码中的任何位置调用其实例化方法.texture_manager需要object在objects_向量中使用s skybox_,并且可能由其他类使用,这些类可能是也可能不是world类的一部分.由于我试图在我的代码中限制单例的使用,您是否建议使用此方法的替代方法?我想到的一个解决方案是将texture_manager引用作为参数传递给需要访问它的所有类的构造函数.谢谢.
Omn*_*ous 11
该问题的一般答案是使用::std::shared_ptr.或者,如果你没有那个,::std::tr1::shared_ptr或者你没有那个,::boost::shared_ptr.
在您的特定情况下,我会建议一些不同的方法:
当然,一种可能性是shared_ptr方法.你基本上把你的指针传递给需要该对象的每个人,当它们都不再需要它时它会被自动销毁.虽然如果你的纹理管理器最终会指向指向它的对象,你就会创建一个引用周期,并且必须非常小心地处理它.
另一种可能性就是将其声明为局部变量,main并将其作为指针或引用传递给需要它的每个人.在您的程序以这种方式完成之前,它不会消失,您不必担心管理生命周期.在这种情况下,裸指针或引用就好了.
第三种可能性是某种类似单身人士的某种模糊可接受的用法之一.这值得详细解释.
你做一个单身人士,唯一的工作就是分发有用的指针.它具有的一个关键特性是能够告诉它将指针分配给什么.它有点像全球可配置工厂.
这使您可以摆脱使用单例创建的巨大测试问题.只需告诉它在测试时就分发指向存根对象的指针.
它还允许您从出于同样的原因逃脱访问控制/安全问题(是的,它们也会产生安全性问题).您可以暂时告诉它传递指向对象的指针,该对象不允许访问您将要执行的代码段不需要访问的内容.这种想法通常被称为最小权威原则.
使用它的主要原因是它可以节省您找出谁需要您的指针并将其交给他们的问题.这也是不使用它的主要原因,认为通过对你有好处.你还介绍了两种预期获得指向纹理管理器的指针实际上可以获得指向不同纹理管理器的指针的可能性,这是因为你没有预料到的控制流,这基本上是由于草率思维导致你首先使用Singleton.最后,单身人士非常可怕,即使这种更加良性的使用也会让我发痒.
就个人而言,在你的情况下,我会建议方法#2,只需在堆栈中创建它main并传入一个指向所需位置的指针.它会让你更仔细地考虑你的程序结构,这种对象应该适用于整个程序的生命周期.