#include <iostream>

using namespace std;

struct F_Key
{
	string content;
	int ref;
};

typedef struct F_Key FKey;

FKey *key_new(const string c)
{
	cout << "new " << c << " key" << endl;

	FKey * k = new FKey();
	k->ref = 0;
	k->content = c;

	return k;
}

int key_del(FKey *k)
{
	cout << "del " << k->content << " key " << k->ref << endl;
	if (k->ref > 1)
	{
		k->ref --;
		return k->ref;
	}
	delete k;
	return 0;
}

int key_inc (FKey *k)
{
	cout << "inc " << k->content << " key " << k->ref << endl;
	k->ref++;
}

class CRefPtr
{
public:
	CRefPtr (const string &c) : key(key_new(c)) {key_inc(key);}
	CRefPtr (const CRefPtr&p) : key(p.key) {key_inc(key);}
	~CRefPtr() { key_del (key); }

	CRefPtr& operator= (const CRefPtr &p)
	{
		if (this != &p) // Zuweisung an sich selbst verhindern
		{
			key_del (key);
			key = p.key; // neues Objekt übernehmen
			key_inc (key);
		}
	}

private:
	FKey *key;
};

int main()
{
	CRefPtr zgr1 ("zgr1");
	cout << "{" << endl;
	{
		CRefPtr zgr2 ("zgr2");
		CRefPtr zgr3 ("zgr3");
		CRefPtr zgr4 ("zgr4");
		CRefPtr zgr5 ("zgr5");
		zgr2=zgr1;
		zgr3=zgr1;
		zgr4=zgr1;
	}
	cout << "}" << endl;
	return 0;
}


