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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2008, 14:13   #1
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию Оптимизировать перегрузку операторов

Перегружаю в классе операторы '+','*','/','-'. Сталкнулся с такой проблемой: для всех опреторов у меня идет один и тот же код. Кроме одного действия: для оператора +, это действие '+', для оператора '-', это - и т.д. Получается, в программе будет много повторяющихся фрагметов, что не желательно. Можно ли как-то это усовершенствовать?
Иллидан вне форума Ответить с цитированием
Старый 22.04.2008, 14:16   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Как это так "один и тот же"? Покажите код, что гадать-то.
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 14:50   #3
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Ну что-то типа такого.
Перегрузка плюса.
Код:
TMoney TMoney::operator +(TMoney A)
{

float a,temp;
TMoney ftemp; 
// тут идет одинаковый код 
//------------------------- 
temp=temp+a;// отличие только в этой строчке
//------------------------
//тут идет одинаковый код

return ftemp;
}
Перегрузка минуса.

Код:
TMoney TMoney::operator -(TMoney A)
{

float a,temp;
TMoney ftemp; 
// тут идет одинаковый код 
//------------------------- 
temp=temp-a;// отличие только в этой строчке
//------------------------
//тут идет одинаковый код
return ftemp;
}
Иллидан вне форума Ответить с цитированием
Старый 22.04.2008, 14:57   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А почему вы минус перегружаете плюсом??? И зачем возвращаете какой-то ftemp, когда, по идее, нужно возвращать *this?
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 15:15   #5
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Цитата:
почему вы минус перегружаете плюсом???
В каком смысле '+', '-' ?
Цитата:
И зачем возвращаете какой-то ftemp, когда, по идее, нужно возвращать *this?
Не очень понял, на сколько я знаю, обычно *this возвращают, когда перегружают унарные операторы(например, ++). Тут же у меня идет обычная перегрузка '+'. То есть, в основной программе, у меня написанно, например:
TMoney A,B,C;
C=A+B;//равенство, я тоже перегружаю, разумеется

Последний раз редактировалось Иллидан; 22.04.2008 в 15:18.
Иллидан вне форума Ответить с цитированием
Старый 22.04.2008, 15:43   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
В каком смысле '+', '-' ?
Да то ли я посмотрел не туда, то ли солнышко отсвечивает , в общем показалось, что у Вас '+' в обоих случаях, так что на это можно не обращать внимания.


Цитата:
Сообщение от Иллидан Посмотреть сообщение
Не очень понял, на сколько я знаю, обычно *this возвращают, когда перегружают унарные операторы(например, ++). Тут же у меня идет обычная перегрузка '+'. То есть, в основной программе, у меня написанно, например:
TMoney A,B,C;
C=A+B;//равенство, я тоже перегружаю, разумеется
Тоже, видимо, не разглядел, где temp превращается в ftemp. А в целом, что такого страшного в одинаковых участках, если там кода всё равно 3-4 строчки. В крайнем случае можно в минусе сделать "return operator+( - A );"....
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 16:02   #7
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Цитата:
А в целом, что такого страшного в одинаковых участках, если там кода всё равно 3-4 строчки.
Там у меня не три строчки кода, а гораздо больше, просто, я не стал их приводить, что-бы захламлять не нужным код. И к тому же аналогично с операторами делить и умножить.

Цитата:
В крайнем случае можно в минусе сделать "return operator+( - A );"....
Не совсем понял, это что?
Иллидан вне форума Ответить с цитированием
Старый 22.04.2008, 16:18   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Там у меня не три строчки кода, а гораздо больше, просто, я не стал их приводить, что-бы захламлять не нужным код. И к тому же аналогично с операторами делить и умножить.
Хм... странно, в этих "деньгах" обычно кода кот наплакал, я из этого и исходил.

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Не совсем понял, это что?
Сложение и унарный минус...
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 17:09   #9
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Ну такие у меня уж "деньги", специфические...
Цитата:
Сложение и унарный минус...
В смысле вы предлагаете так оформить перегрузку минуса?
Код:

TMoney TMoney::operator -(TMoney A)   
{  

return operator+( - A );

}
Это будет работать?
Иллидан вне форума Ответить с цитированием
Старый 22.04.2008, 18:04   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Ну такие у меня уж "деньги", специфические...


Цитата:
Сообщение от Иллидан Посмотреть сообщение
В смысле вы предлагаете так оформить перегрузку минуса?
Код:
TMoney TMoney::operator -(TMoney A)   
{  
	return operator+( - A );
}
В качестве варианта, если Вы так против большого количества кода.
Цитата:
Сообщение от Иллидан Посмотреть сообщение
Это будет работать?
Не просто будет, а работает. Не забудьте только определить унарный минус. Если опустить ненужные детали, это выглядит примерно вот так:
Код:

class CMoney
{
public:
	CMoney(void);
//.........................
	~CMoney(void);

	const CMoney operator-();
	const CMoney CMoney::operator-(CMoney arg);
	const CMoney CMoney::operator+(CMoney arg);
//.........................
//.........................
}

//----------------------------------

const CMoney CMoney::operator-(CMoney arg)
{
	return operator +(-arg);
}

const CMoney CMoney::operator-()
{
	CMoney tmp = *this;
	tmp.nRub = - tmp.nRub;
	return tmp;
}

//----------------------------------

int main()
{
	CMoney arg1, arg2;

	std :: cin >> arg1;
	std :: cin >> arg2;

	std :: cout << arg1 - arg2;

	return 0;
}
B_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15
Использование операторов цикла кася Паскаль, Turbo Pascal, PascalABC.NET 3 02.05.2008 00:32
Помогите оптимизировать! Altera Общие вопросы Delphi 6 25.03.2008 20:09
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57
Помогите оптимизировать сайт Nadejda HTML и CSS 4 07.01.2007 21:04