[ create a new paste ] login | about

Link: http://codepad.org/xrXg5ijY    [ raw code | output | fork ]

C++, pasted on Jan 2:
#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;
}


Output:
1
2
3
4
5
6
7
8
Mode1
TMy1 : 4
TMy2 : 12
i'm deleted
Mode2
TMy1 : 4
TMy2 : 8
i'm deleted


Create a new paste based on this one


Comments: