昨日の「ローカルでない静的オブジェクト」の続き。
初期化の順番が意図しないものになってしまうことのある問題は、ローカルでない静的オブジェクトをローカルな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個しか存在しないようにすればシングルトンパターンとなる。(ただしマルチスレッドは考慮してない)