クラスにポインターを渡す必要があるため、制御できないコードがあります。このコードは、完了するとポインターを自動的に free() しますが、後でクラスが必要になります。コードがクラスにアクセスするのを実際に妨げずに、クラスの割り当てが解除されないようにする「ラッパー」クラスを作成できることを望んでいましたが、仮想呼び出しは機能しません。
template <class T>
class PointerWrapper:public T
{
public:
T* p;
PointerWrapper(T *ptr)
{
p=ptr;
}
~PointerWrapper(void)
{
}
T* operator->() const
{
return p;
}
T& operator*() const
{
return *p;
}
};
void codeIDontControl(Example *ex)
{
ex->virtualfunction();
delete ex;
}
void myCode()
{
Example *ex=new Example();
codeIDontControl(ex);
do something with ex //doesn't work because ex has been freed
codeIDontControl(new PointerWrapper<Example>(ex));
do something with ex //ex hasn't been freed, but the changes made to it via
// Example::virtualfunction() in codeIDontControl() aren't there anymore
}
基本的に、ex->virtualfunction() は、PointerWrapper->p 内の仮想関数ではなく、PointerWrapper 自体内の仮想関数を呼び出します。-> 演算子を無視しているようですか?
これを行う別の方法があれば、PointerWrapper 風のクラスを使用する必要はありませんが、それが私が考えることができるすべてでした...
Example も変更できませんが、サブクラス化できます