codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#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; }
Private
[
?
]
Run code
Submit