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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2008, 23:20   #1
TIN
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 18
По умолчанию С++ перегрузка операций для шаблонного класса

Здравствуйте. Вас приветствует новичок форума.
Пишу шаблонный класс для работы с комплексными числами.
Не удается вынести описание операций за пределы класса,
внутри класса все вроде работает.


Код:
#include <iostream>
using namespace std;
#include <windows.h>


template <class type> class complex {
private:
	type re;
	type im;
public:
	
	friend ostream& operator <<(ostream& out, complex& c) {
		if (c.re > 0) out << c.re;  
		if (c.re < 0) out << "- " << -c.re;
		if (c.re != 0) {
			if (c.im > 0) out << " + " << c.im << "*i";
			if (c.im < 0) out << " - " << -c.im << "*i";
		}
		else  {
			if (c.im > 0) out << c.im << "*i";
			if (c.im < 0) out << "- " << -c.im << "*i";
		}
		if (c.re == 0 && c.im == 0) out << 0;
		cout << endl;
		return out;
	}

	
	friend istream& operator >>(istream& in, complex& c) {
		cout << "Введите действительную и мнимую части: ";
		in >> c.re >> c.im;
		return in;
	}


	complex& operator +(complex& c){
		complex* res = new complex;
		res->re = re + c.re;
		res->im = im + c.im;
		return *res;
	}


	complex& operator -(complex& c){
		complex* res = new complex;
		res->re = re - c.re;
		res->im = im - c.im;
		return *res;
	}


	complex& operator *(complex& c){
		complex* res = new complex;
		res->re = re * c.re - im * c.im;
		res->im = re * c.im + im * c.re;
		return *res;
	}
};


int main() {
	SetConsoleOutputCP(1251);
	SetConsoleCP(1251);

	int choice;
	cout << "Выберите действие:\n";
	cout << "1 - протестировать для типа int, 2 - протестировать для double, 0 - выйти\n";
	cin >> choice;
	cout << endl;
	while (choice) {
		if (choice == 1 || choice == 5) {  // 5 отвечает за выбор другого типа
			cout << "Тестирование для типа int\n\n";
			complex<int> c1, c2;
			choice = 4;
			while (choice%5) {  // т.е. choice != 0 && choice != 5
				if (choice == 4) {  // 4 отвечает за ввод новых чисел
					cout << "Ввод первого числа\n";
					cin >> c1;
					cout << "Ввод второго числа\n";
					cin >> c2;
					cout << endl;
				}
				cout << "Выберите операцию:\n";
				cout << "1 - вычислить сумму, 2- вычислить разность (первое - второе), 3 - вычислить произведение,\n";
				cout << "4 - ввести новые числа, 5 - протестировать для другого типа, 0 - выйти\n";
				cin >> choice;
				cout << endl;
				if (choice == 1) cout << "Сумма чисел равна:  " << c1 + c2 << endl;
				if (choice == 2) cout << "Разность чисел равна:  " << c1 - c2 << endl;
				if (choice == 3) cout << "Произведение чисел равно:  " << c1 * c2 << endl;
			}
		}
		if (choice == 2 || choice == 5) {  // 5 отвечает за выбор другого типа
			cout << "Тестирование для типа double\n\n";
			complex<double> c1, c2;
			choice = 4;
			while (choice%5) {  // т.е. choice != 0 && choice != 5
				if (choice == 4) {  // 4 отвечает за ввод новых чисел
					cout << "Ввод первого числа\n";
					cin >> c1;
					cout << "Ввод второго числа\n";
					cin >> c2;
					cout << endl;
				}
				cout << "Выберите операцию:\n";
				cout << "1 - вычислить сумму, 2- вычислить разность (первое - второе), 3 - вычислить произведение,\n";
				cout << "4 - ввести новые числа, 5 - протестировать для другого типа, 0 - выйти\n";
				cin >> choice;
				cout << endl;
				if (choice == 1) cout << "Сумма чисел равна:  " << c1 + c2 << endl;
				if (choice == 2) cout << "Разность чисел равна:  " << c1 - c2 << endl;
				if (choice == 3) cout << "Произведение чисел равно:  " << c1 * c2 << endl;
			}
		}
	}
	return 0;
}

Последний раз редактировалось SuperVisor; 05.12.2008 в 13:24.
TIN вне форума Ответить с цитированием
Старый 05.12.2008, 11:10   #2
_alexey_
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 13
По умолчанию

Код:
template <class type>
complex<type>& complex<type>::operator +(complex<type>& c){
...
}
_alexey_ вне форума Ответить с цитированием
Старый 05.12.2008, 13:17   #3
TIN
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 18
По умолчанию


Спасибо. С арифметическими операциями разобрался, там я пропустил
complex<type>::

Ввод/вывод не идет. К примеру, ввод описываю так
Код:
template <class type> istream& operator >>(istream& in, complex<type>& c) {
	cout << "Введите действительную и мнимую части: ";
	in >> c.re >> c.im;
	return in;
}

Последний раз редактировалось TIN; 05.12.2008 в 15:57.
TIN вне форума Ответить с цитированием
Старый 05.12.2008, 18:34   #4
_alexey_
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 13
По умолчанию

вот ввод/вывод
Код:
template<typename T> complex;

template<typename T>
std::ostream& operator << (std::ostream& out, complex<T>& qqq) {
	...
}

template<typename T>
class complex {
	....
	friend std::ostream operator << <T> (ostream& out, complex<T>& qqq);
	....
};
ps первом посте friend для операторов << и >> вообще не в тему стоит
_alexey_ вне форума Ответить с цитированием
Старый 06.12.2008, 19:08   #5
TIN
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 18
По умолчанию

Наконец-то добрался до проги
Благодарю! Работает. Но как всё запущено ...
И если не затруднит, прокомментируйте пожалуйста PS (ничего не понял).
TIN вне форума Ответить с цитированием
Старый 06.12.2008, 19:53   #6
_alexey_
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 13
По умолчанию

шаблоны для того и существуют чтобы с ними изврщаться..
вот код с комментариями
Код:
template<typename T> complex; // объявление класса, чтобы можно было его использовать в операторе <<
// сам шаблонный оператор, тут всё ясно
template<typename T>
std::ostream& operator << (std::ostream& out, complex<T>& qqq) {
	...
}

template<typename T>
class complex {
	....
	// описание этого оператора в классе со словом friend нужно только для того, чтобы 
	// оператор ввода/вывода имел доступ к закрытым членам класса
	// << <T> (можно <<<T>) - явное указание типа для этого оператора
	// нужно чтобы компилятор понял какой именно оператор использовать
	friend std::ostream operator << <T> (ostream& out, complex<T>& qqq);
	....
};
_alexey_ вне форума Ответить с цитированием
Старый 06.12.2008, 23:45   #7
TIN
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 18
По умолчанию

Спасибо. Я ведь в целом то понял было.
Мне только строчка
"ps первом посте friend для операторов << и >> вообще не в тему стоит"
была непонятна.
TIN вне форума Ответить с цитированием
Старый 29.03.2009, 15:24   #8
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Интересно, а когда освобождается память, резервируемая new в перегруженных операторах?
Dmitry_B вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь с лабой: «Перегрузка операций» (ООП, класс-АТД, на с++) Nastja Помощь студентам 15 02.07.2010 14:09
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14
Правильная организация класса для работы с таблицей mysql Choo PHP 10 08.08.2008 08:55
Конструктор, наследование, перегрузка операций Lioness Помощь студентам 18 02.06.2008 20:44