2010年6月18日金曜日

OGRE - Singleton

Singleton というのが何かをあらかじめ説明しておくと、C++ のようなオブジェクト指向設計ではしばしば作成したクラスがアプリケーション内で1つだけしかインスタンスを作れないようにしたい場合があり、このとき意図的にインスタンスを1つだけしか作れないように仕込みをしておくテクニックのことです。これはたいてい、誰かが誤って外部から2つ以上のインスタンスを作ろうとするとコンパイルエラーが発生するようになっており、これによって1つしかインスタンスを作成できないはずのクラスのインスタンスが複数存在してしまうというバグをあらかじめ回避しておくことができます。

さて、OGRE に含まれるクラスでも、「Root」やいくつかの「~Manager 」等が Singleton 設計になっているようです。しかし、通常の Singleton とは違っていて、「Root」のインスタンスは自分で作成するようになっており、その他の Signleton クラスのインスタンスは自動的に作られるようですがコンストラクタは public になっているため、インスタンスを複数作ることができてしまいます(複数作ってしまうとこれは当然思わしくない結果になります)。
どうやらこれは DLL のための措置のようです。Singleton の仕組みはクラスの定義内に書くことになりますが、これが OGRE ライブラリのように DLL とその他のアプリケーションの各コンパイル時に参照されるヘッダファイルだったらどうなるか?普通の Singleton 設計されたクラスでこのようなことをすれば、DLL リンク時にインスタンスが組み込まれ、その他のアプリケーション内でもリンク時にインスタンスが組み込まれ、結果として2つのインスタンスが存在することになってしまいます。
これを回避するため OGRE では、Singleton としてはあまりよくない方法ですが、基本的にインスタンスは手動でつくれるような構造になっているけど、実際には勝手にインスタンスを作らないよう気をつけてね、的な構造になっているようです。まあ、実際には Root 以外のほとんどのクラスは自動的にインスタンスが作成されているか Root のメンバ関数を通して作成するかのどちらかなので、失敗することはあまりないと思いますが。うっかりやってしまわないように気をつけないといけないですね。

0 件のコメント:

コメントを投稿