会社でこんなソースを見かけた。
class Hoge { public: static Hoge *Instance; static Hoge *getInstance() { return Instance; } Hoge() { Instance = this; }; void initialize() { if (Instance == 0) Instance = new Hoge; } (略) }; // シングルトン static Hoge hogeInstance; void doSomething() { hogeInstance::Instance->func(); }
見かけたというか、同じ仕組みのクラスがあっちこっちに散らばってた。念のために言っておく、コードはこれで間違いない。何度も見直したからね。
色々と突っ込みどころはあるけど、まず、シングルトンを想定してるのにコンストラクタをpublicで書いちゃう男の人って……。せめて多重生成検知のassertくらい入れようず。
いやいやいや、グループ会社内で(自称)一番技術力が高いと公言してるところの、仮にも俺より高給取りで優秀なプログラマが書いたコードだ。きっと俺なんぞには考えもつかない、深遠なる理由があるに違いない。
でも、色々と考えてみたけど、やっぱり何がしたいのか解らなかった。しかし、メンバ変数を触らないメンバ関数は、クラスの実体が無くても正常に呼べるって事は解った(実験済み)。つまり、上のクラスのinitialize()
は期待通りの動作をする。これがC++の仕様の範疇かどうかは知らない。
静的メンバ関数がヌルポで呼び出せる(static_cast<Hoge*>(0)→staticFunc();
)のは知ってたけど、メンバ関数も大丈夫だとはねぇ…。よーく考えてみれば、確かにメンバ関数はそのクラスで共用だから、関数の実体は静的に存在してるだろうから呼べてもおかしくないはない。でもやっぱり気持ち悪い。