C ++避免全局变量和单例

时间:2013-02-07 01:20:51

标签: c++ pointers memory-management vector static

我最近一直试图从我的项目中删除单例和全局变量的使用,但我很难这样做。我有点设计了一个更好的替代单例和全局变量,但我不知道如何在我的应用程序终止后处理数据。

我的应用程序需要访问一些东西才能使大多数组件正常工作;某些组件需要访问static std::vector<Foo*> foos;,其他组件需要访问static std::vector<Bob*> bobs;,有些组件需要访问这两个组件。我所做的是为这些向量创建“管理器”,一个FooManager,它允许访问受保护的静态向量到继承它的类和一个BobManager,它为另一个向量做同样的事情。通过这样做限制了这两个对象的范围。我的问题是在进程终止时如何以及在何处解除每个向量中的指针?多个类现在是这些对象的“管理器”。从派生类?但是,如果我在另一个类需要原始数据时解除分配,该怎么办?

基本上我的问题是如何在不应该​​删除指针时避免删除指针?的unique_ptr? shared_ptr的?此外,欢迎任何其他实现。

2 个答案:

答案 0 :(得分:1)

如果你有自己的设计选择,Idan的最后一段是要走的路(再次包括):

  

如果你仍然坚持避免使用Singleton模式,那么我会这样做   建议是再次使这些向量非静态,创建一个   每个经理的实例一次在您的主要职能或任何其他   root-ish函数,并将它们传递给任何其他需要它们的对象。   是的,这是很多工作 - 但它可以让你控制那些   向量(以及它们指向的对象)被创建和销毁。要么 -   你可以使用单身人士。

你的问题:

  

基本上我的问题是如何避免在我删除指针时   不应该?的unique_ptr? shared_ptr的?还有其他任何实现   这是受欢迎的。

Reference Counting是解决问题的一种方法。它跟踪对一组数据感兴趣的事物的数量。快速方法(使用当前实现)是在管理器类中包含一个变量,用于跟踪存在的实例数。在析构函数中递减计数器。如果计数器为0,则删除向量。

答案 1 :(得分:0)

如果我理解正确,那么你需要全局访问这两个向量,并且你曾经有过单例来处理每个向量。现在你想要删除那些单例,而是将这些向量作为静态成员并拥有许多Manager类的实例?

别。只是......不要。

全局变量是一个问题。有一种误解认为单身人士是一种全球变量,因此也是一个问题。他们不是 - 单身人士是全局变量问题的解决方案。删除解决方案并不意味着解决问题 - 它只是意味着没有解决方案就会出现问题。

如果您仍然坚持避免使用Singleton模式,我建议您再次使这些向量非静态,在main函数中为每个经理创建一次的单个实例或任何其他root-ish函数,并将它们传递给任何其他需要它们的对象。是的,这是很多工作 - 但它可以让你控制何时创建和销毁这些矢量(以及它们指向的对象)。或者 - 你可以使用单身人士。