Singleton というのが何かをあらかじめ説明しておくと、C++ のようなオブジェクト指向設計ではしばしば作成したクラスがアプリケーション内で1つだけしかインスタンスを作れないようにしたい場合があり、このとき意図的にインスタンスを1つだけしか作れないように仕込みをしておくテクニックのことです。これはたいてい、誰かが誤って外部から2つ以上のインスタンスを作ろうとするとコンパイルエラーが発生するようになっており、これによって1つしかインスタンスを作成できないはずのクラスのインスタンスが複数存在してしまうというバグをあらかじめ回避しておくことができます。
どうやらこれは DLL のための措置のようです。Singleton の仕組みはクラスの定義内に書くことになりますが、これが OGRE ライブラリのように DLL とその他のアプリケーションの各コンパイル時に参照されるヘッダファイルだったらどうなるか?普通の Singleton 設計されたクラスでこのようなことをすれば、DLL リンク時にインスタンスが組み込まれ、その他のアプリケーション内でもリンク時にインスタンスが組み込まれ、結果として2つのインスタンスが存在することになってしまいます。
これを回避するため OGRE では、Singleton としてはあまりよくない方法ですが、基本的にインスタンスは手動でつくれるような構造になっているけど、実際には勝手にインスタンスを作らないよう気をつけてね、的な構造になっているようです。まあ、実際には Root 以外のほとんどのクラスは自動的にインスタンスが作成されているか Root のメンバ関数を通して作成するかのどちらかなので、失敗することはあまりないと思いますが。うっかりやってしまわないように気をつけないといけないですね。
0 件のコメント:
コメントを投稿