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 实例(并且您不想使用单例模式来创建使用 ObjObjManager),您可以创建一个ObjObjManager 的静态成员:

class ObjManager  ... ;

class Obj

private:
   static ObjManager manager;
;

然后当您创建Obj 的实例时,它将与所有其他实例共享相同的ObjManager

【讨论】:

以上是关于C++ 这个类和单例的全局声明有啥好的选择吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的线程有啥好的初学者教程吗? C++ [关闭]

在 C++ 11 中初始化二维数组有啥好的方法吗? [复制]

spring中创建bean对象时多例和单例的区别

不处理 C# 方法的返回值可以吗?这个例子中有啥好的做法?

学习C语言的指针部分有啥好的方法吗?真的很难啊!!

图像中的文本定位有啥好的算法吗?