設計(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 を返すことが出来なくなってしまうので、こうするしかない。