我最近一直试图从我的项目中删除单例和全局变量的使用,但我很难这样做。我有点设计了一个更好的替代单例和全局变量,但我不知道如何在我的应用程序终止后处理数据。
我的应用程序需要访问一些东西才能使大多数组件正常工作;某些组件需要访问static std::vector<Foo*> foos;
,其他组件需要访问static std::vector<Bob*> bobs;
,有些组件需要访问这两个组件。我所做的是为这些向量创建“管理器”,一个FooManager,它允许访问受保护的静态向量到继承它的类和一个BobManager,它为另一个向量做同样的事情。通过这样做限制了这两个对象的范围。我的问题是在进程终止时如何以及在何处解除每个向量中的指针?多个类现在是这些对象的“管理器”。从派生类?但是,如果我在另一个类需要原始数据时解除分配,该怎么办?
基本上我的问题是如何在不应该删除指针时避免删除指针?的unique_ptr? shared_ptr的?此外,欢迎任何其他实现。
答案 0 :(得分:1)
如果你有自己的设计选择,Idan的最后一段是要走的路(再次包括):
如果你仍然坚持避免使用Singleton模式,那么我会这样做 建议是再次使这些向量非静态,创建一个 每个经理的实例一次在您的主要职能或任何其他 root-ish函数,并将它们传递给任何其他需要它们的对象。 是的,这是很多工作 - 但它可以让你控制那些 向量(以及它们指向的对象)被创建和销毁。要么 - 你可以使用单身人士。
你的问题:
基本上我的问题是如何避免在我删除指针时 不应该?的unique_ptr? shared_ptr的?还有其他任何实现 这是受欢迎的。
Reference Counting是解决问题的一种方法。它跟踪对一组数据感兴趣的事物的数量。快速方法(使用当前实现)是在管理器类中包含一个变量,用于跟踪存在的实例数。在析构函数中递减计数器。如果计数器为0,则删除向量。
答案 1 :(得分:0)
如果我理解正确,那么你需要全局访问这两个向量,并且你曾经有过单例来处理每个向量。现在你想要删除那些单例,而是将这些向量作为静态成员并拥有许多Manager类的实例?
别。只是......不要。
全局变量是一个问题。有一种误解认为单身人士是一种全球变量,因此也是一个问题。他们不是 - 单身人士是全局变量问题的解决方案。删除解决方案并不意味着解决问题 - 它只是意味着没有解决方案就会出现问题。
如果您仍然坚持避免使用Singleton模式,我建议您再次使这些向量非静态,在main
函数中为每个经理创建一次的单个实例或任何其他root-ish函数,并将它们传递给任何其他需要它们的对象。是的,这是很多工作 - 但它可以让你控制何时创建和销毁这些矢量(以及它们指向的对象)。或者 - 你可以使用单身人士。