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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2011, 10:30   #1
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию Виртуальные функции-операции и friend'ы

Такая проблема. Попробую изобразить схематично.
Есть базовый абстрактный класс и куча производных. В базовом классе есть перегруженные операции. Типа такого:
Код:
сlass T {
public:
   virtual T& operator+=(const T&) = 0;
   virtual T& operator-=(const T&) = 0;
   ...
}
Есть также производные классы T1, T2...(например)
Для каждого из них определены friend'ы типа такого. Причём все они работают по одинаковой схеме.
Код:
T1 operator+(const T& a, const T& b) { 
   T1 tmp(a);
   tmp += b;
   return tmp;
}
И так для каждого производного класса. Код по сути отличается только возвращаемым типом. Хотелось бы не повторять этот код каждый раз для каждого нового класса. Возвращать ссылку на временный объект нельзя. Экземпляры абстрактного класса вернуть тоже нельзя(впрочем, так и задумывалось). В то же время если возвращать объекты конкретных типов всё хорошо работает потому что в функцию мы можем их передать в параметр типа const T&. Но получается много повторяющегося кода.

Подскажите пожалуйста, как решить такую проблему.

Последний раз редактировалось megachuhancer; 09.03.2011 в 10:33.
megachuhancer вне форума Ответить с цитированием
Старый 09.03.2011, 14:50   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

T1 operator+(const T& a, const T& b)
вы не описались в этой строчке?
экземпляров Т нельзя же создать.

по сабжу: возникают мысли создать класс шаблон, содержащий арифм операции, и пусть этот класс буду наследовать ваши классы Т1..Тn с нужны аргументом в <>, попробывал реализовать -но неуспешно.

если решите - отпишитесь - интересно.
onewho вне форума Ответить с цитированием
Старый 09.03.2011, 22:50   #3
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
T1 operator+(const T& a, const T& b)
вы не описались в этой строчке?
экземпляров Т нельзя же создать.
передача по ссылке есть завуалированная передача указателя, так что все по правилам указателя на базовый класс

по поводу шаблона позже отпишусь
alex_x_x вне форума Ответить с цитированием
Старый 09.03.2011, 23:38   #4
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

можно объявить
Код:
template<class _T>
_T operator+(const T& a, const T& b) { 
   _T tmp(a);
   tmp += b;
   return tmp;
}
и

Код:
friend T1 operator+<T1>(const T& a, const T& b);
будет комппилябельно, но на месте расползется
специализировать шаблон как и функцию по выходному значению - сомнительная идея

ну самое тупое - написать макрос ;d
alex_x_x вне форума Ответить с цитированием
Старый 11.03.2011, 14:27   #5
n@sok
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 46
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
T1 operator+(const T& a, const T& b)
вы не описались в этой строчке?
экземпляров Т нельзя же создать.
а кто и где их тут создает?

Цитата:
Сообщение от alex_x_x Посмотреть сообщение
Код:
friend T1 operator+<T1>(const T& a, const T& b);
будет комппилябельно
Разве компилятор не будет против, ведь функции с одинаковыми передаваемыми параметрами, различающие только типом возвращаемого значения перегружать нельзя, иначе компилятор не сможет определить какую из них нужно вызывать в данном месте.
n@sok вне форума Ответить с цитированием
Старый 11.03.2011, 15:38   #6
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от n@sok Посмотреть сообщение
Разве компилятор не будет против, ведь функции с одинаковыми передаваемыми параметрами, различающие только типом возвращаемого значения перегружать нельзя, иначе компилятор не сможет определить какую из них нужно вызывать в данном месте.
так в принципе на этом дело и остановилось
alex_x_x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВИРТУАЛЬНЫЕ ФУНКЦИИ в Delphi MaxMad Помощь студентам 0 30.05.2010 20:06
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44
НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ С++ ermac52 Помощь студентам 1 05.06.2009 11:03
Одиночное наследование Виртуальные функции Brunette Помощь студентам 3 08.05.2008 19:23
Кто сможет разъяснить как и зачем использовать виртуальные функции в C++? Dunhil Помощь студентам 5 20.12.2007 14:19