Версия функции clone().

Рубрика: C++, Дата: 19 April, 2013, Автор:

Напишите версию функции clone() из параграфа 15.6.2, которая помещала б клонированные объекты в область памяти типа Arena (смотрим параграф 10.4.11), переданную в качестве аргумента. Реализуйте простой конкретный класс для работы с фиксированными областями памяти, как производный от абстрактной области Arena.

Вообщем еле еле домучил я эту функцию clone(). Кароче оказывается все нормально работает если мы вызываем для класса без виртуальных функций, ну и не работает если мы вызываем для класса с виртуальными функциями. Вообщем фигня такая получается ну или коректно работает для класса с виртуальными функциями если мы токо класс ничем не инициализируем.

Смотрите вот код:

//fynkci9 clone()
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;

//bazovui klacc dl9 Arena
class Arena
{
public:
	virtual void* alloc(size_t)=0;
	//virtual void* free(
};

//klacc potomok Arena
class Arena_1 : public Arena
{
public:
	// ecli virtual dobovl9yu to owibka xz. pochemy
	void* alloc(size_t size)
	{
		cout <<"alloc"<<endl;
		return this;
	}
};

//klacc ob6ektu kotorogo bydyt vctraivatc9
class X
{
public:
	int val;
	X(){}
	X(int a):val(a){}
	X(X& a):val(a.val){}
	X* clone(Arena_1* p)
	{
		return new(p)X(*this);
	}
};

//peregryzka new
void* operator new(size_t size, Arena_1* a)
{
	cout <<"mu tyt"<<endl;//<<' '<<size<<endl; //exit(1);
	a->alloc(size);
}

int main()
{
	Arena_1* p=new(Arena_1);//cozdaem oblact6 pam9ti tipa Arena_1
	X a;
	X* c=new(p)X;//pervui toko normal6no vctraivaetc9
	//a vce octal6nue idyt c owibkoi
	//c->val=7;
	X* b=new(p)X;
	//b->val=35;
	X* d=a.clone(p);
	X* k=a.clone(p);
	cout <<p<<' '<<c<<' '<<b<<' '<<d<<' '<<k<<endl;
		
	
	return 0;
}

Вот он красавчик. Я с ним долго реально промучился, так что щас вам выложил просто пример где мы используем виртуальные функции но конструктор ничем не инициализируем. Отакие от дела малята! 🙂

[youtube]http://www.youtube.com/watch?v=1xNscDd5Kko[/youtube]

rss