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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дружественная перегружаемая операция + 
:(
    Опции темы
Волод
Дата 29.8.2005, 08:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет! В книге Лафоре есть вот такой пример кода:
Код

// frengl.cpp
// Дружественная перегружаемая операция +
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Distance                //Класс английских расстояний
  {
  private:
    int feet;
    float inches;
  public:
    Distance()                //конструктор без аргументов
      { feet = 0; inches = 0.0; }
    Distance( float fltfeet ) //конструктор (1 арг.)
      {    //Переводит float в Distance
      feet = int(fltfeet);    //feet – целая часть
      inches = 12*(fltfeet-feet); //слева - дюймы
      }
    Distance(int ft, float in)    //конструктор (2 арг.)
      { feet = ft; inches = in; }
    void showdist()              //Вывести длину
      { cout << feet << "\'-" << inches << '\"';}
    friend Distance operator + (Distance, Distance); //дружественный
  };
//---------------------------------------------------------

Distance operator + (Distance d1, Distance d2) // d1 + d2
  {
  int f = d1.feet + d2.feet;       //+ футы
  float i = d1.inches + d2.inches; //+ дюймы
  if(i >= 12.0)                    //если больше 12 дюймов,
    { i -= 12.0; f++;  }           //уменьшить на 12 дюймов,
                                   //прибавить 1 фут
  return Distance(f,i);            //Новая длина с суммой
  }
//---------------------------------------------------------
int main()
  {
  Distance d1 = 2.5;         //конструктор переводит
  Distance d2 = 1.25;        //float-feet в Distance
  Distance d3;
  cout << "\nd1 = "; d1.showdist(); 
  cout << "\nd2 = "; d2.showdist();

  d3 = d1 + 10.0;            //distance + float: OK
  cout << "\nd3 = "; d3.showdist();
  d3 = 10.0 + d1;            //float + Distance: OK
  cout << "\nd3 = "; d3.showdist();
  cout << endl;
  return 0;
  }

никак не могу откомпилировать его в VC++ 6.0
Выкидывает ошибку: fatal error C1001: INTERNAL COMPILER ERROR, и указывает на строку ошибки < friend Distance operator + (Distance, Distance); //дружественный >
Все глаза проглядел, но в чем проблема разобраться не смог… smile

  Вверх
Волод
Дата 29.8.2005, 08:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Это вообще-то только первый вопрос, а второй вопрос: - если предположить, что код все-таки корректный, я не могу понять столь странный способ объявления дружественного оператора: < operator + (Distance, Distance > . Мне непонятно, почему функция перегрузки оператора содержит два параметра и что они означают - в смысле что (как) программа подставляет в качестве аргументов при вызове такой функции....
  Вверх
Orlan
Дата 29.8.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В Visual C++ 7.1 код компилируется и выдает некий резултат. Проблема в 6-м компиляторе.
Цитата
- если предположить, что код все-таки корректный, я не могу понять столь странный способ объявления дружественного оператора:  < operator + (Distance, Distance > . Мне непонятно, почему функция перегрузки оператора содержит два параметра и что они означают - в смысле что (как) программа подставляет в качестве аргументов при вызове такой функции....

Оператор складывает два аргумента: x+y, левый и правый - первый и второй пареметры соответственно. В данном случае оператор не является членом класса.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
chaos
Дата 29.8.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



а у меня все на 6 компилится без всяких проблем
PM WWW   Вверх
Волод
Дата 29.8.2005, 12:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Так, с первым вопросом я разобрался - только что поставил SP6, а по второму мне не понятен все же смысл. Я имею в виду, что раз опрератору передаются два параметра в круглых скобках, в моем понимании выражение должно выглядеть что-то типа .... +(d1, d2); Или, методом от обратного, подскажите, как должно выглядеть выражение, если функция имеет объявление вида:
friend Distance operator + (Distance); //один параметр
friend Distance operator + (Distance, Distance, Distance); //три параметра

Я цепляюсь за это потому, что Лафоре в пояснениях приведенного выше кода приводит такие строчки: Обратите внимание, что для перегружаемого + первый аргумент - метод, тогда как второй - дружественная функция. По моему, полный бред, ведь слепому видно, что в выражении типа d3=d1+d2 в качестве аргументов передаются простые объекты Distance, а никакие не методы или функции.
  Вверх
Волод
Дата 29.8.2005, 12:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Chaos, скинь свое мыло на [email protected]. Хотелось бы пару вопросов задать...
  Вверх
Leksey
Дата 29.8.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
friend Distance operator + (Distance, Distance, Distance); //три параметра

Насколько я знаю оператор + может быть только бинарным или унарным.
И записываться будет так:
operator +(d1,d2);//В случае бинарного
operator +(d1); //В случае унарного

PM MAIL   Вверх
chaos
Дата 29.8.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



Цитата(Leksey @ 29.8.2005, 12:48)
Насколько я знаю оператор + может быть только бинарным или унарным.

это ты правельно подметил: тернарных операций нет в С++
PM WWW   Вверх
Leksey
Дата 29.8.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще есть : ?: , но ее перегружать нельзя.
А жаль..
Я когда начал C++ изучать и увидел ее чуть не умер от смеха... smile
Добавлено @ 13:07
А по поводу мыла Волод.
Мне кажется проще зарегистрроваться и использовать средства общения с участниками, которые предоставляет форум.
ИМХО Удобная Штука.
PM MAIL   Вверх
Earnest
Дата 31.8.2005, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Лафоре в пояснениях приведенного выше кода приводит такие строчки: ...

А Лафоре - это русский? В переводных книгах еще не такие перлы можно встретить...
Что касается аргументов операторов, то все просто: как уже было сказано, операторы бывают унарные и бинарные. Какой именно определен, зависит от числа параметоров. Но при этом нужно всегда помнить, что операторы-методы класса всегда имеют первым неявный параметр this. Так что можно написать:

Код

class Distance
{
   friend Distance operator + (Distance,Distance);
};

или
Код

class Distance
{
  Distance operator + (Distance) const;
};

В контексте вызова это будет выглядеть одинаково:
Код

Distance a,b,c;
a = b + c;

Какой способ выбрать - во многом дело вкуса. Но чаще всего бинарные операторы определяют как внешние, из соображений симметрии.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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