#include <stdio.h>
namespace SMode1
{
//------------------------------------------------------------------------------
class TPtrBase
{
friend class TDelPtrBase;
protected:
TPtrBase() : m_Counter(0) {}
virtual ~TPtrBase() {}
private:
long m_Counter;
};
class TDelPtrBase
{
public:
TDelPtrBase(TPtrBase *in_ptr) : Ptr(in_ptr) { Ptr->m_Counter++; }
~TDelPtrBase()
{
if (!Ptr) return;
Ptr->m_Counter--; if (!Ptr->m_Counter) delete Ptr;
}
TPtrBase *Ptr;
};
template<class TClass> class TDelPtr : public TDelPtrBase
{
public:
TDelPtr(TClass *in_ptr) : TDelPtrBase(in_ptr) {}
};
//------------------------------------------------------------------------------
class TBase
{
public:
virtual ~TBase() {}
};
class TMy1 : public TBase
{
public:
virtual ~TMy1() {}
};
class TMy2 : public TBase, public TPtrBase
{
public:
virtual ~TMy2() { printf("i'm deleted\n"); }
};
}
namespace SMode2
{
template<class TClass> class TDelPtrBase;
//------------------------------------------------------------------------------
template<class TClass> class TPtrBase
{
friend class TDelPtrBase<TClass>;
protected:
TPtrBase() : m_Counter(0) {}
private:
long m_Counter;
};
template<class TClass> class TDelPtrBase
{
public:
TDelPtrBase(TClass *in_ptr) : Ptr(in_ptr) { Ptr->m_Counter++; }
~TDelPtrBase()
{
if (!Ptr) return;
Ptr->m_Counter--;
if (!Ptr->m_Counter)
delete Ptr;
}
TClass *Ptr;
};
template<class TClass> class TDelPtr : public TDelPtrBase<TClass>
{
public:
TDelPtr(TClass *in_ptr) : TDelPtrBase<TClass>(in_ptr) {}
};
//------------------------------------------------------------------------------
class TBase
{
public:
virtual ~TBase() {}
};
class TMy1 : public TBase
{
public:
virtual ~TMy1() {}
};
class TMy2 : public TBase, public TPtrBase<TMy2>
{
public:
virtual ~TMy2() { printf("i'm deleted\n"); }
};
}
//------------------------------------------------------------------------------
int main()
{
{
printf("Mode1\n");
printf("TMy1 : %d\n", sizeof(SMode1::TMy1));
printf("TMy2 : %d\n", sizeof(SMode1::TMy2));
SMode1::TDelPtr<SMode1::TMy2> ptr1(new SMode1::TMy2);
}
{
printf("Mode2\n");
printf("TMy1 : %d\n", sizeof(SMode2::TMy1));
printf("TMy2 : %d\n", sizeof(SMode2::TMy2));
SMode2::TDelPtr<SMode2::TMy2> ptr2(new SMode2::TMy2);
}
return 0;
}