单件类singleton

2.利用静态成员和静态函数设计实现一个单件类Singleton。所谓单件类,就是指在内存中最多仅有一个对象实例。提示:
a)不可以用构造函数创建对象,才能确保对象创建是可控的;(通过构造函数私有化来实现的)
b)当前是否有存在对象必须是随时可以知道的,并且如果存在,随时可以取得该对象的指针或者引用(通过静态成员变量来保存)
c)因为构造函数私有化,导致变量无法从外部创建,因而必须为用户提供一个获取对象的接口,当前对象如果存在,该接口直接返回对象引用,否则创建对象并返回对象引用。(通过静态成员函数来实现)
思考:同学们可以思考,如果想要实现对象池,把对象的数量控制在N以内,应该怎么修改?

http://www.360doc.com/content/20/0808/01/71093473_929112574.shtml

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7486456
  • 除此之外, 这篇博客: 指针和数组试题解析(重置版)中的 小编,在这里想说一下,c语言的最后一节 C预处理,可能还需要一些时间,因为小编,昨天才下载了虚拟机 和 linux 系统,还没开始安装。所以无法着手写,因为 C预处理,vs2013很难表达,也就意味可能会讲不清楚。所以这篇文章可能需要点时间,再加上小编初期的文章,是没有排版的(而且可能有些错误,请大家以重置版为准),所以这几天我就把这些重新写。有兴趣的朋友可以看看。(ps:如果哪一天没有更新,意味着小编正在努力学习,为了能给大家呈现一片详细好懂的文章。) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:


  • 以下回答由chatgpt基于相关博客总结生成:

    问题a) 为了实现构造函数的私有化,可以将构造函数声明为私有成员函数。这样,外部无法直接通过构造函数来创建对象。

    以下是一个使用静态成员变量和静态函数实现单件类的示例代码:

    class Singleton {
    private:
        static Singleton* instance; // 静态成员变量,用于保存对象的指针
        Singleton() {} // 私有构造函数
    
    public:
        static Singleton* getInstance() { // 静态成员函数,用于获取对象的引用或指针
            if (instance == nullptr) { // 如果对象不存在,创建对象
                instance = new Singleton();
            }
            return instance; // 返回对象的引用或指针
        }
    };
    
    Singleton* Singleton::instance = nullptr; // 静态成员变量需要在类外进行定义和初始化
    

    问题b) 为了保存对象的状态,可以使用静态成员变量来存储对象的指针或引用。静态成员变量在整个类的实例中是共享的,因此可以保证只有一个对象实例。

    问题c) 通过静态成员函数实现单件类的接口,静态成员函数内部调用私有构造函数来创建对象,并返回对象的引用或指针。

    如果要限制对象数量,在一个对象池中最多只能存在N个对象,可以在静态成员函数中通过判断对象数量来决定是否创建新的对象。当对象池中的对象数量达到上限时,可以选择不创建新的对象,或者移除旧的对象来为新对象腾出空间。

    以下是一个修改后的示例代码:

    class Singleton {
    private:
        static Singleton* instance; // 静态成员变量,用于保存对象的指针
        static const int MAX_OBJECTS = 10; // 对象池最大容量
        static int numObjects; // 对象数量
        Singleton() {} // 私有构造函数
    
    public:
        static Singleton* getInstance() { // 静态成员函数,用于获取对象的引用或指针
            if (instance == nullptr && numObjects < MAX_OBJECTS) { // 如果对象不存在且未达到上限,创建对象
                instance = new Singleton();
                numObjects++;
            }
            return instance; // 返回对象的引用或指针
        }
    
        static void removeInstance() { // 静态成员函数,用于移除对象
            if (instance != nullptr) { // 如果对象存在,移除对象
                delete instance;
                instance = nullptr;
                numObjects--;
            }
        }
    };
    
    Singleton* Singleton::instance = nullptr; // 静态成员变量需要在类外进行定义和初始化
    int Singleton::numObjects = 0; // 对象数量初始化为0
    

    这样,通过 Singleton::getInstance() 获取对象时,最多只能存在 N 个对象。

    如果要进一步限制并发访问,可以在 getInstance() 和 removeInstance() 函数内部添加互斥锁,以保证同一时间只有一个线程在创建或移除对象。使用C++11提供的std::mutex或std::lock_guard来实现互斥锁。