Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка =, ->, (), [], Почему только методами? 
:(
    Опции темы
UnrealMan
Дата 16.6.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Earnest @  16.6.2006,  10:23 Найти цитируемый пост)
Выносим в заголовок? И то, и другое одинаково плохо.

Чем плох вынос в заголовок такого глобального определения:

Код
template <class T1, class T2>
bool operator !=(T1 &t1, T2 &t2)
{
    return !(t1==t2);
}


Это сообщение отредактировал(а) UnrealMan - 16.6.2006, 17:10
PM MAIL   Вверх
Earnest
Дата 16.6.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Уточняю: плохо не вообще выносить такие определения в заголовочные файлы, а отделать их от интерфейса класса. Другими словами, если A - библиотечный класс (в файле, который ты не должен менять), а ты определяешь для него какой-нибудь глобальный оператор,  для определенности ==, в другом заголовочном файле, ты создаешь возможность разного сравнения объектов A в разных модулях. Т.е. все начинает зависеть от того, включена ли твоя версия оператора или нет. Если учесть, что h-файлы имеют тенденцию вкладываться друг в друга, то в один прекрасный момент может случиться так, что добавление еще одного include с какой-нибудь нужной функциональностью, приведет к изменению сравнения объектов A. Причем сразу это можно и не заметить.

Избежать эту ситуацию можно только если последовательно придерживаться принципа:
весь интерфейс объекта должен быть определен там же, где и сам объект. Нужно тебе локально изменить сравнение объектов A - заверни их в класс B и реализуй новые операторы для него.
Это относится ко всем общеупотребимым операторам: +, <, etc.

 


--------------------
...
PM   Вверх
UnrealMan
Дата 16.6.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата
Чем плох вынос в заголовок такого глобального определения

Уже вижу, чем :-) С переопределением оператора != под конкретный класс (при необходимости) возникают проблемы (операторы-друзья вообще идут лесом, независимо от константности ссылок T&). Хотя в чём может заключаться эта необходимость?

Цитата(Earnest @  16.6.2006,  17:39 Найти цитируемый пост)
в один прекрасный момент может случиться так, что добавление еще одного include с какой-нибудь нужной функциональностью

Применительно к моему примеру (!= и == можно поменять местами) функциональность вряд ли будет изменена. 
PM MAIL   Вверх
DeadSoul
Дата 16.6.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



UnrealMan, тем, что ты научишься сравниваит и мои классы тоже. 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
MAKCim
Дата 16.6.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

код можно было написать и без перегрузки запятой,
пользуясь лишь "<<" 

так неинтересно  smile  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
UnrealMan
Дата 17.6.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(DeadSoul @  16.6.2006,  20:32 Найти цитируемый пост)
UnrealMan, тем, что ты научишься сравниваит и мои классы тоже. 

Не понял. Попробуй объяснить попонятней. 
PM MAIL   Вверх
DeadSoul
Дата 17.6.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(UnrealMan @  17.6.2006,  10:45 Найти цитируемый пост)
Цитата(DeadSoul @  16.6.2006,  20:32 )
UnrealMan, тем, что ты научишься сравниваит и мои классы тоже. 
Не понял. Попробуй объяснить попонятней.  

После включения h-файла c твоим шаблоном operator!= будет определен для ВСЕХ классов содержащих operator!=. А ты не думаешь, что я специально не создавал оператор!=?!
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 17.6.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(DeadSoul @  17.6.2006,  11:31 Найти цитируемый пост)
А ты не думаешь, что я специально не создавал оператор!=?!

Это ещё зачем специально его не создавать?

Добавлено @ 12:37 
Цитата(DeadSoul @  17.6.2006,  11:31 Найти цитируемый пост)
будет определен для ВСЕХ классов содержащих operator!=. 

Ты, должно быть, хотел сказать "содержащих operator=="? 
PM MAIL   Вверх
DeadSoul
Дата 17.6.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(UnrealMan @  17.6.2006,  12:36 Найти цитируемый пост)
Цитата(DeadSoul @  17.6.2006,  11:31 )
А ты не думаешь, что я специально не создавал оператор!=?!
Это ещё зачем специально его не создавать?

Затем же зачем конструкторы делают explicit. Чтобы компилятор сообщал мне об ошибках



Цитата(UnrealMan @  17.6.2006,  12:36 Найти цитируемый пост)
Цитата(DeadSoul @  17.6.2006,  11:31 )
будет определен для ВСЕХ классов содержащих operator!=. 
Ты, должно быть, хотел сказать "содержащих operator=="?  

Ну да 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 17.6.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Т.е. оператор== создали, а != запретили. Не пойму, в чём прикол. Смысл такого запрета? Операторы не запрещают для того, чтобы компилятор выдавал ошибку (ошибка – это следствие запрета, а не причина :-) ). 
PM MAIL   Вверх
DeadSoul
Дата 17.6.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(UnrealMan @  17.6.2006,  13:22 Найти цитируемый пост)
Т.е. оператор== создали, а != запретили. Не пойму, в чём прикол. Смысл такого запрета? 

В том, что мне НЕ нужен оператор != 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
LPBOY
Дата 17.6.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(0x07L @  15.6.2006,  19:24 Найти цитируемый пост)
Почему только методами?  

Где-то слышал (по крайней мере про operator= ), что запретили его глобальный аналог, потому что в этом случае возможны любые преобразования над объектом по правую сторону от него, что не очень интуитивно. 
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
UnrealMan
Дата 17.6.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(DeadSoul @  17.6.2006,  14:05 Найти цитируемый пост)
В том, что мне НЕ нужен оператор !=  

Ну, не используй, коли не нужен :-) Запрещать-то зачем? 
PM MAIL   Вверх
DeadSoul
Дата 18.6.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(UnrealMan @  17.6.2006,  15:16 Найти цитируемый пост)
Цитата(DeadSoul @  17.6.2006,  14:05 )
В том, что мне НЕ нужен оператор !=  
Ну, не используй, коли не нужен :-) Запрещать-то зачем?  

Зачем, что бы при попытке использования данного оператора(который я не писал) я получил ошибку компилятора, а не непонятные глюки
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 18.6.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(DeadSoul @  18.6.2006,  16:57 Найти цитируемый пост)
что бы при попытке использования данного оператора(который я не писал) я получил ошибку компилятора

Зачем тебе эта ошибка? Раз ты пытаешься использовать этот оператор, значит, он тебе уже нужен. Причём нужен именно в значении отрицания == (в противном случае это какой-то очень странный стиль программирования получается).

Цитата(DeadSoul @  18.6.2006,  16:57 Найти цитируемый пост)
а не непонятные глюки

Какие здесь могут быть глюки? 
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0880 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.