crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> пергрузка operator+ и operator+=
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2010, 12:48
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Дошла очередь до освоения перегрузки этих операторов:
operator+=
operator+


В книге Герберта Шилдта по С++, обе эти оператора объявляются и реализуются, как члены класса. А вот у тролей почему-то operator+ повсеместно используется как связанный не-член класса (т.е. описан просто в этом же заголовочнике), ну и соответственно он имеет два аргумента, а не один.

Пример:
Связанный не-член класса
const QString operator+ ( const QString & s1, const QString & s2 )

член класса
QString & operator+= ( const QString & other )


Как же правильнее поступать? Делать operator+ членом класса или связанным не-членом

П.С. ещё я не понял, почему троли для operator+ возвращают константный объект, ведб тогда нельзя будет использовать запись типа:
obj1 + obj2 + obj3 + ...

тут пардон, перепутал с operator= и конструкцией вида obj1 = obj2 = obj3

Я планировал сделать такой перегруженный оператор:
Type &operator+ ( const Type & s1, const Type & s2 )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 21.4.2010, 13:52
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Вроде как не везде..
Цитата
QList<T> QList::operator+ ( const QList<T> & other ) const

То же самое в QSet, QVector. В QString наоборот.. непонятно почему..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2010, 14:20
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kibsoft, да, я полез смотреть в Qt, и на несколько классов напоролся, где сделано как в QString, подумал, что всюду так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 21.4.2010, 15:30
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.4.2010, 12:48) *
Пример:
Связанный не-член класса
const QString operator+ ( const QString & s1, const QString & s2 )

член класса
QString & operator+= ( const QString & other )


Как же правильнее поступать?

советую обзавестись и почитать книжку Липпман "С++ для начинающих", там в пункте
15.1.1. Члены и не члены класса
есть ответ
в двух словах:
глобальный оператор+ дает возможность плюсовать так:
QString str = "world";
QString concat_str = "hello " + str;

тоесть char* + QString
А если его обьявить как локальный оператор класса, то левым операндом может быть только QString. Тоесть на приведенном коде будет ошибка компиляции.
Цитата
Итак, на основе чего принимается решение, делать ли оператор членом класса или членом пространства имен? В некоторых случаях у программиста просто нет выбора:
• если перегруженный оператор является членом класса, то он вызывается лишь при условии, что левым операндом служит член этого класса. Если же левый операнд имеет другой тип, оператор обязан быть членом пространства имен;
• язык требует, чтобы операторы присваивания ("="), взятия индекса ("[]"), вызова ("()") и доступа к членам по стрелке ("->") были определены как члены класса. В противном случае выдается сообщение об ошибке компиляции:


З.Ы так же посоветую почитать книги:
Мэйерс Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Саттер Александреску Стандарты программирования на С++
Правила программирования на Си и Си++ Ален И. Голуб
Саттер Решение сложных задач на С++
Макконнел Совершенный код, 2-е изд
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.4.2010, 17:01
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


в дополнение к сказанному выше: когда ты делаешь много операторов подобного типа с разными классами, то, если ты скомпилишь их внутри класса, то библиотека с твоим классом будет зависеть от библиотек всех классов, которые ты туда запихал. тот, кто будет потом использовать твой класс, может и не использовать все варианты, но ему придётся линковать все классы, которые ты засунул в свой класс, даже если он использует только один какой-то конкретный вариант. а в случае с внешней функцией при линковке неиспользуемые операторы просто не будут линковаться и всё. компилятору хватит включения заголовочников.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.4.2010, 11:35
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(DIMEDROLL @ 21.4.2010, 19:30) *
А если его обьявить как локальный оператор класса, то левым операндом может быть только QString.
да я уже Гербета Шилдта это нашёл. Что-то мне его книга всё меньше и меньше нравится.
Первое место, где было про перегрузку оператора + написано об этом ни слова. Через несколько глав опять про этот оператор уже с двумя вариантами.
Плохо, что так раскидано по книге

Цитата(Iron Bug @ 21.4.2010, 21:01) *
а в случае с внешней функцией при линковке неиспользуемые операторы просто не будут линковаться и всё.
а в таком случае, где они должны быть объявлены? Я пока вижу в разных примерах, что они объявлены в том же заголовочнике что и сам класс, только "под ним"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.4.2010, 14:13
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 22.4.2010, 14:35) *
а в таком случае, где они должны быть объявлены? Я пока вижу в разных примерах, что они объявлены в том же заголовочнике что и сам класс, только "под ним"

да, всё правильно. там они и должны объявляться. и включать все заголовочники на классы, которые в них используются. но на этапе линковки неиспользуемые функции отбросятся. а если засунуть методы внутрь класса, то тогда придётся ещё и линковать всё, что к классу относится, с твоей библиотекой. впрочем, это существенно только если предполагается многократное использование класса в разных программах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.4.2010, 15:06
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


На мой взгляд, уже на таком профессиональном уровне, что ты, книгу Шилдта не стоит использовать (даже на уровне справочника). Лучше уже Страуструпом пользоваться. Так по его книге говорится, что операторы +, - и их варианты лучше делать не-членами класс, а вот += -= членами класса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 1:12