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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 22:10   #1
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию Шаблоны С++

Здравствуйте. Помогите пожалуйста с решением одной проблемы.

Мне требуется разработать шаблон, реализующий функции дека. Особенность в том, что он должен работать не только со стандартными типами данных, но и с производными.

Вот так работает:
Dec<std::string> D;
D.push("1","2","3","4"); и т.д

А мне нужно переделать, чтобы шаблон работал со структурой:
Dec<Student> m1;
m1.push(Student(...));

Вот исходный код модуля:
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

template <typename CData>
class Dec
{
private:
        struct Node {    
			Node(CData const& u, CData const& f, CData const& c, CData const& s) {
					university=u;
					faculty=f;
					chair=c;
					study=s;

					next=NULL;
					prev=NULL;
				}

				CData university, faculty, chair, study;
				Node *next, *prev;
        };

		Node* Head;
		Node* Tail;
        
		int size;

public:


	//Dec() : university(""), faculty(""), chair(""), study("") {}
	//Dec();

	Dec() { Head=NULL, Tail=NULL; size=0; }

	Dec(string u, string f, string c, string s) : university(u), faculty(f), chair(c), study(s) {}

	Dec(const Dec & another) : university(another.university), faculty(another.faculty), chair(another.chair), study(another.study) {}

	 ~Dec() { clear(); }

	Dec &operator=(const Dec &another)
	{
		if (&another != this) {
			university = another.university;
			faculty = another.faculty;
			chair = another.chair;
			study = another.study;
		}
		return *this;
	}
   
        bool clear() {
                while(Head) {
                        Node* tmp=Head;
                        Head=Head->next;
                        delete tmp;
                }
                return true;
        }

        bool push(CData const& u, CData const& f, CData const& c, CData const& s) {
                Node* tmp=new Node(u,f,c,s);

				tmp->next=Head;
				tmp->prev=NULL;

				if (Head) Head->prev = tmp;

                Head=tmp;
                if(!Tail) {
						Tail=Head;
                        size++;
                        return true;
                }
				size++;
                
                return true;
        }

        bool pop() {
                Node* tmp=Head;

				if (!tmp) return false;
				Head=tmp->next;

				if (Head) Head->prev=NULL;
				else Tail=NULL;
	
				std::cout<<tmp->university<<"\t";
				std::cout<<tmp->faculty<<"\t";
				std::cout<<tmp->chair<<"\t";
				std::cout<<tmp->study<<"\n";

                delete tmp;
                size--;
                
				return true;
        }

		bool cmp(int x1, int x2) {
			 Node* tmp=Head;
			 if (!tmp) return false;

			 if ( (x1>=size) || (x2>=size) || (x1<0) || (x2<0) ) 
				return false;

			 for (int i=0; i<x1; i++) 
				tmp=tmp->next;

			 Node* t1=new Node(tmp->university, tmp->faculty, tmp->chair, tmp->study);

			 tmp=Head;
			 for (int i=0; i<x2; i++) 
				tmp=tmp->next;
			 
			 Node* t2=new Node(tmp->university, tmp->faculty, tmp->chair, tmp->study);

			 std::cout<<"\n СРАВНЕНИЕ ЭЛЕМЕНТОВ \n\n";
			 std::cout<<"["<<x1<<"]\t";
			 std::cout<<t1->university<<"\t"<<t1->faculty<<"\t"<<t1->chair<<"\t"<<t1->study;
			 std::cout<<"\n["<<x2<<"]\t";
			 std::cout<<t1->university<<"\t"<<t1->faculty<<"\t"<<t1->chair<<"\t"<<t1->study<<"\n";

			 if ( (t1->university == t2->university) &&
				  (t1->faculty == t2->faculty) &&
				  (t1->chair == t2->chair) &&
				  (t1->study == t2->study) ) 
				  std::cout<<"\n Объекты равны ";

			 if ( (t1->university < t2->university) &&
				  (t1->faculty < t2->faculty) &&
				  (t1->chair < t2->chair) &&
				  (t1->study < t2->study) )
				  std::cout<<"\n Первый объект МЕНЬШЕ второго ";

			 if ( (t1->university > t2->university) &&
				  (t1->faculty > t2->faculty) &&
				  (t1->chair > t2->chair) &&
				  (t1->study > t2->study) ) 
				  std::cout<<"\n Первый объект БОЛЬШЕ второго ";
				 
			 printf("\n-------------------------------------------------\n");

			 return true;
		}   
};


int main()
{
	setlocale(LC_ALL, "Russian");

	std::cout<<"===================\n\n";

	Dec<std::string> D;
	D.push("ПГУ","ФВТ","ВТ","очная");
	D.push("ПГПУ","ФЕНР","ЕР","Заочная");


	D.cmp(0,2);
		
	D.pop();
		
	D.clear();

	_getch();
    return 0;
}
Помогите пожалуйста. Заранее спасибо)
applegrub вне форума Ответить с цитированием
Старый 15.05.2012, 22:32   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Ну так а чо. Замени все вхождения string на твой шаблонный параметр (CData), перегрузи ему operator<< для вывода на экран, и будет тебе счастье.
Son Of Pain вне форума Ответить с цитированием
Старый 15.05.2012, 22:46   #3
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Ну так а чо. Замени все вхождения string на твой шаблонный параметр (CData), перегрузи ему operator<< для вывода на экран, и будет тебе счастье.
Если бы все было так просто. Вот изменил строку:

Код:
Dec<CData> D;
Компилятор ругается, говорит что структура CData не определена
applegrub вне форума Ответить с цитированием
Старый 16.05.2012, 01:17   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а у вас нет такого, вы не понимаете смысл шаблонов?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны Romario92 C++ Builder 2 18.04.2011 19:46
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Шаблоны C++ Viamy Помощь студентам 0 27.12.2009 16:10
Шаблоны, Си++ Нataша Помощь студентам 1 11.12.2009 01:35
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 09:50