smart_this(3)
昨日のやり方だと、多くの問題が出てダメだった。
しかし逆に言えば、その問題さえ解決すればいいのだ。
現在分かっている問題点は4つ。
- smart_thisをローカルで作ってしまうと、スマートポインタのセットが出来ない
- _this に代入する時点で、_this が初期化されていない
- operator new を抜けた時点で、smart_thisを継承したクラスが解放される
- private な _this へアクセスするための権限が無いため、コンパイルが通らない
これらをそれぞれ解決していけば、なんとかなりそうだ。
まず1番。
これは、コンストラクタを使用できないようにすればいい。
smart_this は継承によって使用するので、アクセスレベルは protected ということになる。
class smart_this{ protected: smart_this(){} };
2番は飛ばして、3番。
これはそもそも operator new を使おうという発想が間違っている。
スマートポインタをセットし、スマートポインタを返すような、smart_this の creator を作成して解決する。
template< class T > class smart_this{ public: static smart_ptr< T > create(){ smart_ptr< T > p( (T*)::malloc( sizeof( T ) ) ); p->setThis( p ); ::new( &*p ) T(); return p; } };
mallocで確保した領域へのポインタをスマートポインタ p にセットし、p を _this にセットする。
そして placement new でコンストラクタを呼び出して、出来上がったスマートポインタを返す。
これで、return をした時点でポインタが解放されるということは無くなる。
続きはまた明日。。