Исправьте ошибки в определении List.

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

Исправьте ошибки в определении List из 13 параграфа и напишите С++ код, эквивалентный тому, что сгенерирует компилятор из определения List и функции f(). Протестируйте работу обоих версий кода. Если вы можете это сделать, то сравните машинные коды.

Здорова! Ну что ж сразу приведу код класса List и функции f().

//wablon klacca List
#include <iostream>
using std::cout;
using std::endl;

template<class T>
class List
{
	struct Link
	{
		Link* pre;
		Link* suc;
		T val;
		Link(Link* p, Link* s, const T& v):pre(p),suc(s),val(v){}
	};//syntax error; otcytctvyet tochka c zap9toi
	
	Link* head;
	
public:
	List():head(0){}//error: ykazatel6 inicializiryetc9 tipom int
	List(const T& t):head(new Link(0,0,t)){}//error: neopredelennui identifikator 'o'
	//...
	void print_all() const
	{
		for(Link* p=head; p; p=p->suc) 
			cout <<p->val<<'\n';
	}
};

class Rec {/* ... */};

void f(const List<int>& li, const List<Rec>& lr)
{
	li.print_all();
	//lr.print_all();
}

int main()
{
	
	
	return 0;
}

Я по исправлял ошибки.

Для функции void f(const List<int>& li, const List<Rec>& lr); компилятор сгенерирует следующий код. Просто для List<int> будет код отакой:

class List
{
	struct Link
	{
		Link* pre;
		Link* suc;
		int val;
		Link(Link* p, Link* s, const int& v):pre(p),suc(s),val(v){}
	};//syntax error; otcytctvyet tochka c zap9toi
	
	Link* head;
	
public:
	List():head(0){}//error: ykazatel6 inicializiryetc9 tipom int
	List(const int& t):head(new Link(0,0,t)){}//error: neopredelennui identifikator 'o'
	//...
	void print_all() const
	{
		for(Link* p=head; p; p=p->suc) 
			cout <<p->val<<'\n';
	}
};

Все T заменятся на int, а для Link<Rec> следующий:

class List
{
	struct Link
	{
		Link* pre;
		Link* suc;
		Rec val;
		Link(Link* p, Link* s, const Rec& v):pre(p),suc(s),val(v){}
	};//syntax error; otcytctvyet tochka c zap9toi
	
	Link* head;
	
public:
	List():head(0){}//error: ykazatel6 inicializiryetc9 tipom int
	List(const Rec& t):head(new Link(0,0,t)){}//error: neopredelennui identifikator 'o'
	//...
	void print_all() const
	{
		for(Link* p=head; p; p=p->suc) 
			cout <<p->val<<'\n';
	}
};

Все T заменятся на Rec. Отакая от фигня.

“Протестируйте работу обоих версий кода. Если вы можете это сделать, то сравните машинные коды.”  Да одинаково они будут работать нечего тестировать, машинные коды сравнить я естественно не могу. 🙂

rss