![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Волод |
|
|||
|
Unregistered |
Всем привет! В книге Лафоре есть вот такой пример кода:
никак не могу откомпилировать его в VC++ 6.0 Выкидывает ошибку: fatal error C1001: INTERNAL COMPILER ERROR, и указывает на строку ошибки < friend Distance operator + (Distance, Distance); //дружественный > Все глаза проглядел, но в чем проблема разобраться не смог… |
|||
|
||||
| Волод |
|
|||
|
Unregistered |
Это вообще-то только первый вопрос, а второй вопрос: - если предположить, что код все-таки корректный, я не могу понять столь странный способ объявления дружественного оператора: < operator + (Distance, Distance > . Мне непонятно, почему функция перегрузки оператора содержит два параметра и что они означают - в смысле что (как) программа подставляет в качестве аргументов при вызове такой функции....
|
|||
|
||||
| Orlan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 10.6.2004 Где: Киев Репутация: нет Всего: 1 |
В Visual C++ 7.1 код компилируется и выдает некий резултат. Проблема в 6-м компиляторе.
Оператор складывает два аргумента: x+y, левый и правый - первый и второй пареметры соответственно. В данном случае оператор не является членом класса. --------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
а у меня все на 6 компилится без всяких проблем
|
|||
|
||||
| Волод |
|
|||
|
Unregistered |
Так, с первым вопросом я разобрался - только что поставил SP6, а по второму мне не понятен все же смысл. Я имею в виду, что раз опрератору передаются два параметра в круглых скобках, в моем понимании выражение должно выглядеть что-то типа .... +(d1, d2); Или, методом от обратного, подскажите, как должно выглядеть выражение, если функция имеет объявление вида:
friend Distance operator + (Distance); //один параметр friend Distance operator + (Distance, Distance, Distance); //три параметра Я цепляюсь за это потому, что Лафоре в пояснениях приведенного выше кода приводит такие строчки: Обратите внимание, что для перегружаемого + первый аргумент - метод, тогда как второй - дружественная функция. По моему, полный бред, ведь слепому видно, что в выражении типа d3=d1+d2 в качестве аргументов передаются простые объекты Distance, а никакие не методы или функции. |
|||
|
||||
| Волод |
|
|||
|
Unregistered |
Chaos, скинь свое мыло на [email protected]. Хотелось бы пару вопросов задать...
|
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Насколько я знаю оператор + может быть только бинарным или унарным. И записываться будет так: operator +(d1,d2);//В случае бинарного operator +(d1); //В случае унарного |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
это ты правельно подметил: тернарных операций нет в С++ |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Вообще есть : ?: , но ее перегружать нельзя.
А жаль.. Я когда начал C++ изучать и увидел ее чуть не умер от смеха... Добавлено @ 13:07 А по поводу мыла Волод. Мне кажется проще зарегистрроваться и использовать средства общения с участниками, которые предоставляет форум. ИМХО Удобная Штука. |
|||
|
||||
| Earnest |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А Лафоре - это русский? В переводных книгах еще не такие перлы можно встретить... Что касается аргументов операторов, то все просто: как уже было сказано, операторы бывают унарные и бинарные. Какой именно определен, зависит от числа параметоров. Но при этом нужно всегда помнить, что операторы-методы класса всегда имеют первым неявный параметр this. Так что можно написать:
или
В контексте вызова это будет выглядеть одинаково:
Какой способ выбрать - во многом дело вкуса. Но чаще всего бинарные операторы определяют как внешние, из соображений симметрии. -------------------- ... |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |