Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2009, 22:44   #1
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию Пользовательский тип в шыблонных классах

Код:
#include <iostream>
#include <cstring>

using namespace std;
template <class T>
class ochered
{
	class chered
	{
		//human t;
		friend class ochered<T>;
		T inf;
		chered *nx;
		chered(){ nx=NULL; inf=0;}
		~chered() {}
	};
	chered *h,*t;       //указатели на head и tail очереди
public:
	ochered () { h=t=0;}   
	ochered (T k) { add(k);}  
	~ochered(); 
	void add(T);        //функция добавления в очередь
	void print();       //функция вывода содержимого очереди
	void del_any(T);   //функция удаления любого элемента из очереди
   // template <class T>	friend istream& operator >> (istream&,ochered&);
};


***********************************************
template <class T>
ochered<T>::~ochered()
{
	chered *temp;
	while(h)
	{
		temp=h->nx;
		delete h;
		h=temp;
	}
}
template <class T>
void ochered<T>::add(T a)
{ chered *n;
  puts("Создание очереди \n");
  n=new chered;
  n->inf=a;
  if (!h)                 // очерель еще не создана
	  h=t=n;          // устанавливаем оба указателя (голова и хвост)
	                       // на единственный элемент очереди
  else                     // очередь уже создана
  { 
	  t->nx=n;     // добавляем очередной элемент в очередь
	  t=n;               // передвигаем указатель на хвост
  }
}
template <class T>
void ochered<T>::print()
{
	chered *temp=h;
	system("cls");
	puts("Вывод содержимого очереди \n");
	if (!temp)                           // указатель NULL
	{
		puts("Очередь пуста");
		system("pause");
		return;
	}
	do                               
	{ 
		cout<<temp->inf<<endl;    // вывод текущего элемента 
		temp=temp->nx;                        // переход к следующему
	} while(temp);
	system("pause");
	return;
}

template <class T>
void ochered<T>::del_any(T st)
{ 
	chered *f=h,*pr=h,*qwer=h; 
	if (!h) 
	{ 
		puts("Очередь пуста");
		system("pause");
		return; 
	} 
	if (!h->nx && h->inf==st)        // в очереди только один элемент 
	{ 
		delete h; 
		h=NULL;
				             // очередь пуста 
		return; 
	} 
                  // далее f предыдущий к  pr элемент 
	while(pr) 
	{ 
		if (pr->inf==st) // найден элемент со строкой  st 
		{  
			if (pr==h)
			{
				h=h->nx; 
				delete pr;
				pr=f=h;
				//f=pr;
			 } 
			else 
			{
				f->nx=pr->nx;   // обходим элемент  pr 
				delete pr;       // удаляем элемент  pr очереди 
				pr=f->nx;       // выбор следующего элемента очереди pr 
			}
		}
		else {f=pr; pr=pr->nx;}  // переход к следующему элементу 
	} 
}

*****************************************************
template <class T> void menu(ochered<T>*);
int main()
{
	int i;
	setlocale(LC_ALL,"Russian");
	cout<<"Выберите с каким типом информации в очереди вы хотите работать:\n 1. int\n 2. char\n 3. float\n 4. double \n 5. long int\n 6. human"<<endl;
	cin>>i;
	switch(i)
	{
	case 1:{ochered<int> *database=new ochered<int>; menu(database); break;}
	case 2:{ochered<char> *database=new ochered<char>; menu(database); break;}
	case 3:{ochered<float> *database=new ochered<float>; menu(database); break;}
	case 4:{ochered<double> *database=new ochered<double>; menu(database);break;}
	case 5:{ochered<long int> *database=new ochered<long int>; menu(database);break;}
	//case 6: {ochered<human> *database=new ochered<human>; menu(database); break;}
	default: {cout<<"Автоматически очередь будет хранить информачцию INT"; ochered<int> *p=new ochered<int>; menu(p);}
	}
	
}
template <class T>
void menu(ochered<T> *database)
{
	int button;
	T i;
	while(1)
	{
		system("cls");
		cout<<"Выберите желаемое действие с очередью:\n 1. Добавить элемент в очередь\n 2. Просмотр содержимого очереди \n 3. Удаление информации из очереди\n 0. Выход";
		cin>>button;
		switch(button)
		{
		case 1: {
			int number;
			cout<<"Введите какое кол-во вы хотите ввести элементов в очередь: ";
			cin>>number;
			system("cls");
			for(int temp=0;temp<number;temp++)
			{
				cout<<"Введите значение в элемент очереди: "; cin>>i; database->add(i);
			}break;}
		case 2: database->print(); break;
		case 3: {cout<<"Введите какое значение хотите удалить"; cin>>i; database->del_any(i); break;}
		case 0: exit(0);
		}
	}
	return;
}
есть рабочая прога очереди для разных типов данных int,double,char и т.д.
а как сделать чтобы в очереди хранился тип структуры (вместо int, чтобы был пользовательский тип)
Код:
struct human
{
	char nik[10];
	int health;
	int mana;
};
kedbl4 вне форума Ответить с цитированием
Старый 17.11.2009, 23:25   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
ochered<human>
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 17.11.2009, 23:27   #3
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Код:
ochered<human>
а как тогда перегрузить >> заполнение?

пробую, все никак не получается...
kedbl4 вне форума Ответить с цитированием
Старый 17.11.2009, 23:28   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Для структуры перегружай.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 17.11.2009, 23:37   #5
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию

прописал в классе такое
Код:
template <class T> friend istream& operator >> (istream&,human&);
вот сама перегрузка
Код:
template <class T>
istream& operator >>(istream& c,human &temp)
{
	int x;
	cout<<"Введите nik:"<<endl;
	fflush(stdin);
	c.getline(temp.nik,10);
	cout<<"Введите health:"<<endl;
	cin>>x;
	temp.health=x;
	cout<<"Введите mana:"<<endl;
	cin>>x;
	temp.mana;
	return c;
}
36 ошибок выбило...подскажите что не так делаю
kedbl4 вне форума Ответить с цитированием
Старый 18.11.2009, 15:17   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
#include <iostream>
#include <cstring>

using namespace std;
template <class T>
class ochered
{
	class chered
	{
		//human t;
		friend class ochered<T>;
		T inf;
		chered *nx;

		chered():nx(0), inf(T()) {}
		~chered() {}
	};
	chered *h,*t;       //указатели на head и tail очереди
public:
	ochered () { h=t=0;}   
	ochered (T k) { add(k);}  
	~ochered(); 
	void add(T);        //функция добавления в очередь
	void print();       //функция вывода содержимого очереди
	void del_any(T);   //функция удаления любого элемента из очереди
   // template <class T>	friend istream& operator >> (istream&,ochered&);
};


//***********************************************
template <class T>
ochered<T>::~ochered()
{
	chered *temp;
	while(h)
	{
		temp=h->nx;
		delete h;
		h=temp;
	}
}
template <class T>
void ochered<T>::add(T a)
{ chered *n;
  puts("Создание очереди \n");
  n=new chered;
  n->inf=a;
  if (!h)                 // очерель еще не создана
	  h=t=n;          // устанавливаем оба указателя (голова и хвост)
	                       // на единственный элемент очереди
  else                     // очередь уже создана
  { 
	  t->nx=n;     // добавляем очередной элемент в очередь
	  t=n;               // передвигаем указатель на хвост
  }
}
template <class T>
void ochered<T>::print()
{
	chered *temp=h;
	system("cls");
	puts("Вывод содержимого очереди \n");
	if (!temp)                           // указатель NULL
	{
		puts("Очередь пуста");
		system("pause");
		return;
	}
	do                               
	{ 
		cout<<temp->inf<<endl;    // вывод текущего элемента 
		temp=temp->nx;                        // переход к следующему
	} while(temp);
	system("pause");
	return;
}

template <class T>
void ochered<T>::del_any(T st)
{ 
	chered *f=h,*pr=h,*qwer=h; 
	if (!h) 
	{ 
		puts("Очередь пуста");
		system("pause");
		return; 
	} 
	if (!h->nx && h->inf==st)        // в очереди только один элемент 
	{ 
		delete h; 
		h=NULL;
				             // очередь пуста 
		return; 
	} 
                  // далее f предыдущий к  pr элемент 
	while(pr) 
	{ 
		if (pr->inf==st) // найден элемент со строкой  st 
		{  
			if (pr==h)
			{
				h=h->nx; 
				delete pr;
				pr=f=h;
				//f=pr;
			 } 
			else 
			{
				f->nx=pr->nx;   // обходим элемент  pr 
				delete pr;       // удаляем элемент  pr очереди 
				pr=f->nx;       // выбор следующего элемента очереди pr 
			}
		}
		else {f=pr; pr=pr->nx;}  // переход к следующему элементу 
	} 
}

//*****************************************************
template <class T> void menu(ochered<T>*);


struct human
{
	char nik[10];
	int health;
	int mana;

	bool operator == (const human&){
		//......
		return true;
	}
};

istream& operator >> (istream& c,human &temp)
{
	int x;
	cout<<"Введите nik:"<<endl;
	fflush(stdin);
	c.getline(temp.nik,10);
	cout<<"Введите health:"<<endl;
	cin>>x;
	temp.health=x;
	cout<<"Введите mana:"<<endl;
	cin>>x;
	temp.mana;
	return c;
}


ostream& operator << (ostream& c,const human &temp)
{
	//******
	return c;
}

int main()
{
	int i;
	setlocale(LC_ALL,"Russian");
	cout<<"Выберите с каким типом информации в очереди вы хотите работать:\n 1. int\n 2. char\n 3. float\n 4. double \n 5. long int\n 6. human"<<endl;
	cin>>i;
	switch(i)
	{
	case 1:{ochered<int> *database=new ochered<int>; menu(database); break;}
	case 2:{ochered<char> *database=new ochered<char>; menu(database); break;}
	case 3:{ochered<float> *database=new ochered<float>; menu(database); break;}
	case 4:{ochered<double> *database=new ochered<double>; menu(database);break;}
	case 5:{ochered<long int> *database=new ochered<long int>; menu(database);break;}
	case 6: {ochered<human> *database=new ochered<human>; menu(database); break;}
	default: {cout<<"Автоматически очередь будет хранить информачцию INT"; ochered<int> *p=new ochered<int>; menu(p);}
	}
	
}
template <class T>
void menu(ochered<T> *database)
{
	int button;
	T i;
	while(1)
	{
		system("cls");
		cout<<"Выберите желаемое действие с очередью:\n 1. Добавить элемент в очередь\n 2. Просмотр содержимого очереди \n 3. Удаление информации из очереди\n 0. Выход";
		cin>>button;
		switch(button)
		{
		case 1: {
			int number;
			cout<<"Введите какое кол-во вы хотите ввести элементов в очередь: ";
			cin>>number;
			system("cls");
			for(int temp=0;temp<number;temp++)
			{
				cout<<"Введите значение в элемент очереди: "; cin>>i; database->add(i);
			}break;}
		case 2: database->print(); break;
		case 3: {cout<<"Введите какое значение хотите удалить"; cin>>i; database->del_any(i); break;}
		case 0: exit(0);
		}
	}
	return;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 18.11.2009, 17:04   #7
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию

спс за помощь
kedbl4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в классах и функциях. Serror Общие вопросы C/C++ 11 10.10.2009 06:23
Пользовательский компонент (Delphi) aaa777 Помощь студентам 2 14.05.2009 00:42
Пользовательский тип данных cudalover Помощь студентам 10 05.04.2009 17:04
Пользовательский формат VBA Excel luxery Microsoft Office Excel 13 07.11.2008 21:00
реализация стратегии на классах mahsus Общие вопросы C/C++ 1 28.12.2007 10:27