設計(3)
このライブラリのミソは、ほとんどのクラスは参照型オブジェクトだという点だ。
簡単に言ってしまえば、Java ライクなのだ。
例えば Java で、
Hoge hoge; hoge.foo();
こんなプログラムを書くと、エラーが出る。
なぜなら、Hoge は実体への参照であり、その実体は new によって生成しなければならないからだ。
つまり、
Hoge hoge; hoge = new Hoge(); hoge.foo();
こうやって、実体を生成しなければならないのだ。
これを C++ で単純に書いてみると、次のようになる。
class HogeData{ public: virtual void foo(){} virtual void bar(){} private: int _hoge; }; class Hoge{ public: Hoge() : _data( null ){} void set( HogeData* data ){ _data = data; } void foo(){ _data->foo(); } void bar(){ _data->bar(); } private: HogeData* _data; };
Hoge hoge; hoge.set( new HogeData ); hoge.foo();
ポインタの解放をしていないのでダメだけど、とりあえずこんな感じだろう。
Hoge と HogeData の両方に foo() 関数を実装して、Hoge::foo() は HogeData::foo() を呼び出すようにしている。
こうすることによって、ドット演算子によって HogeData::foo() にアクセスすることが可能になる。
委譲するのが面倒なのだけれども、だからといって operator->() で代用すると、this を返すことが出来なくなってしまうので、こうするしかない。