1

典型的なシングルトンでは、 getInstance() が初めて呼び出されたときにコンストラクターが呼び出されます。必要なのは、init 関数と getInstance 関数を分離することです。init 関数はコンストラクターを使用してインスタンスを作成する必要があり、getInstance は init 関数が呼び出された場合にのみ使用できます (そうでない場合は例外がスローされます)。これどうやってするの?

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

1 に答える 1

2

init メソッドで、init が成功したことを示す bool を設定します。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
于 2013-02-09T22:27:04.107 に答える