ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

関数に対するstaticなオブジェクト

昨日の「ローカルでない静的オブジェクト」の続き。
初期化の順番が意図しないものになってしまうことのある問題は、ローカルでない静的オブジェクトをローカルなstaticオブジェクトにしてしまえばよい。
問題のオブジェクトを適当な関数の中に移動して、その関数でstaticなオブジェクトにするということ。
昨日のプログラムを書き換えたのは次の通り。
test1.h

class Test1 {
public:
    Test1() {
        cout << "Test1" << endl;
    }

    void func() {
        cout << "Test1::func()" << endl;
    }
};

Test1& getTest1()
{
    static Test1 s_Test1;
    return s_Test1;
}

test0.h

class Test0 {
public:
    Test0() {
        cout << "Test0" << endl;
        getTest1().func();
    }

    void func() {
        cout << "Test0::func()" << endl;
    }
};

Test0& getTest0()
{
    static Test0 s_Test0;
    return s_Test0;
}

main.cpp

#include "test0.h"

int main()
{
    getTest0().func();
    getTest1().func();
}

前のソースではg_Test0,g_Test1だったのをgetTest0(),getTest1()と関数にした。その関数内でstaticでオブジェクトを作成している。実行結果は次の通り。

Test0
Test1
Test1::func()
Test0::func()
Test1::func()

このクラスのコンストラクタをprivateにして、オブジェクトが1個しか存在しないようにすればシングルトンパターンとなる。(ただしマルチスレッドは考慮してない)