C++ 这个类和单例的全局声明有啥好的选择吗? [复制]
Posted
技术标签:
【中文标题】C++ 这个类和单例的全局声明有啥好的选择吗? [复制]【英文标题】:C++ Are there any good alternatives to global declaration of this class and singleton? [duplicate]C++ 这个类和单例的全局声明有什么好的选择吗? [复制] 【发布时间】:2013-10-18 21:44:08 【问题描述】:如何在没有单例的情况下创建此类的单个实例,以及如何声明它以便另一个类可以访问它而无需全局声明它?
请阅读代码(尤其是 cmets)以便更好地理解:
#include <iostream>
#include <vector>
// The only class that will be using this class is Obj...
// There can only be a single instance of ObjManager but how can I do that
// without singleton???
class ObjManager
friend class Obj;
int i;
;
// Since I cannot think of a better way of accessing the SAME and ONLY ObjManager, I
// have decided to declare a global instance of ObjManager so every instance of
// Obj can access it.
ObjManager g_ObjManager;
class Obj
friend class ObjManager;
public:
void Set(int i);
int Get();
;
void Obj::Set(int i)
g_ObjManager.i += i;
;
int Obj::Get()
return g_ObjManager.i;
;
int main()
Obj first_obj, second_obj;
first_obj.Set(5);
std::cout << second_obj.Get() << std::endl; // Should be 5.
second_obj.Set(10);
std::cout << first_obj.Get() << std::endl; // Should be 15.
std::cin.get();
return 0;
;
【问题讨论】:
没有明显的理由不需要上帝对象。当您是程序员时,上帝就在椅子和监视器之间,您不能将工作交给其他人。 这不是单例模式的重点吗?没有那个你为什么要这样做? 通过你正在做的事情,你可以用一个静态成员完成同样的事情。 【参考方案1】:为什么不这样:
class ObjManager
private:
ObjManager()
public:
static ObjManager& get()
static ObjectManager m;
return m;
friend class Obj;
int i;
;
然后只需致电ObjManager::get
获取参考。作为奖励,只有在您实际使用它时才会构建它。它仍然是一个单例,但它比全局好一点(在我看来)。
【讨论】:
【参考方案2】:如果您希望所有 Obj
实例共享同一个 ObjManager
实例(并且您不想使用单例模式来创建使用 Obj
的 ObjManager
),您可以创建一个Obj
中ObjManager
的静态成员:
class ObjManager ... ;
class Obj
private:
static ObjManager manager;
;
然后当您创建Obj
的实例时,它将与所有其他实例共享相同的ObjManager
。
【讨论】:
以上是关于C++ 这个类和单例的全局声明有啥好的选择吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Windows 中的线程有啥好的初学者教程吗? C++ [关闭]