Singleton构造函数与get_instance()分离

Singleton constructor separated from get_instance()

本文关键字:分离 instance 构造函数 get Singleton      更新时间:2023-10-16

在典型的单例中,第一次调用getInstance()时会调用构造函数。我需要的是将init和getInstance函数分开。init函数必须使用构造函数创建实例,并且只有在调用了init函数的情况下才能使用getInstance(否则会引发异常)。我该怎么做?

    Singleton::init(required argument); //calls constructor
    Singleton::getInstance(); //only possible if init had been called, otherwise throws exception

在init方法中设置一个bool,表示init成功。在getInstance方法中,如果异常为false,则抛出异常。

您可以将它作为静态私有成员存储在类中。

#include <iostream>
class Single
{
public:
    static void init(int x)
    {
        single.number = x;
        inited = true;
    }
    static Single & GetInstance()
    {
        //Do exception stuff here....
        if(inited)
        {
            std::cout << "Inited" << std::endl;
        }
        else
        {
            std::cout << "NOT Inited" << std::endl;
        }
        return single;
    }

    void printTest()
    {
    std::cout << single.number << std::endl;
    }
private:
    Single() : number(5)
    {
        std::cout << "Construction " << std::endl;
    }
    int number;
    static bool inited;
    static Single single;
};
bool Single::inited = false;
Single Single::single;
int main()
{
    std::cout << "Entering main" << std::endl;
    Single::GetInstance();
    Single::init(1);
    Single::GetInstance().printTest();
}

程序输出:

Construction 
Entering main
NOT Inited
Inited
1