設計(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 指定をしてやらないといけないのが面倒だが、これ以外に良い方法は無さそうだ。