smart_this(3)

昨日のやり方だと、多くの問題が出てダメだった。


しかし逆に言えば、その問題さえ解決すればいいのだ。



現在分かっている問題点は4つ。

  1. smart_thisをローカルで作ってしまうと、スマートポインタのセットが出来ない
  2. _this に代入する時点で、_this が初期化されていない
  3. operator new を抜けた時点で、smart_thisを継承したクラスが解放される
  4. 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 をした時点でポインタが解放されるということは無くなる。


続きはまた明日。。