設計(5)

あとは、どうやって実オブジェクトを生成するか、という問題がある。


今までは仮実装として new で生成したポインタをセットしていたが、new の返り値がポインタなのは頂けない。リークの原因になる。
あと、内部クラスである Data クラスにもアクセスされてしまう。これはユーザに見せないで隠蔽しておきたいところだ。


つまり、実オブジェクトを生成するための Factory を用意すればいいのだ。

class Object{
public:
    class Data{};
protected:
    smart_ptr< Data > _obj;
private:
    friend class Factory< Object >;
};
template< class T >
class Factory{
public:
    static T create(){
        T t;
        t._obj = smart_ptr< T::Data >( new T::Data );
        return t;
    }
};
Object obj = Factory< Object >::create();

こんな感じだろう。
Data クラスへのアクセス権がないので、Data クラスを持ったクラス全てに friend 指定をしてやらないといけないのが面倒だが、これ以外に良い方法は無さそうだ。