Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
molny
0 / 0 / 0
Регистрация: 20.05.2010
Сообщений: 6
#1

Простая перегрузка оператора - C++

13.06.2012, 21:37. Просмотров 583. Ответов 2
Метки нет (Все метки)

Доброго времени суток. Как и многие в этом разделе прошу о помощи. Преподавателем была поставлена задача создать класс "Дробь", далее же маразматическое условие перегрузить оператор сложения (просто сложить числитель и знаменатель каждой дроби не приводя их к общему знаменателю). Вроде бы старался придерживаться примерам, показанным в литературе, однако при компилировании ниже указанного кода получаю ошибку:

/home/molny/projects/Overloading/main.cpp:16:39: error: ‘Drib& Drib::operator+(Drib&, Drib&)’ must take either zero or one argument
Оператор сложения ведь бинарный, но почему тогда сообщается о "must take one argument"?! Буду очень признателен всем за помощь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
class Drib {
public:
  friend Drib& operator+(Drib&, Drib&);
  int chys, znam;
  void SetDrib(int a, int b) { chys=a; znam=b; }
  void GetDrib() { cout<<chys<<"/"<<znam<<endl; }
} first, second, summ;
 
Drib& Drib::operator+(Drib& c, Drib& d)
{
  Drib temp;
  temp.chys=c.chys+d.chys;
  temp.znam=c.znam+d.znam;
  return temp;
}
 
int main(int argc, char **argv) {
    first.SetDrib(1,2);
    second.SetDrib(3,4);
    summ=first+second;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 21:37     Простая перегрузка оператора
Посмотрите здесь:

Перегрузка оператора += C++
C++ Перегрузка оператора +=
Перегрузка оператора () C++
Перегрузка оператора * C++
Перегрузка оператора *= C++
Перегрузка оператора C++
Перегрузка оператора = C++
Перегрузка оператора C++
Перегрузка оператора + C++
C++ Перегрузка оператора <<
C++ Перегрузка оператора +
C++ Перегрузка оператора <<

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrey.K
340 / 261 / 15
Регистрация: 14.11.2010
Сообщений: 480
13.06.2012, 22:08     Простая перегрузка оператора #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <conio.h>
using namespace std;
 
class Drib 
{
public:
  Drib operator+(Drib);
  int chys, znam;
  void SetDrib(int a, int b) { chys=a; znam=b; }
  void GetDrib() { cout<<chys<<"/"<<znam<<endl; }
} first, second, summ;
 
Drib Drib::operator+ (Drib obj)
{
    int c=chys+obj.chys;
    int z=znam+obj.znam;
    Drib NewObj;
    NewObj.chys=c;NewObj.znam=z;
    return NewObj;
}
 
int main() 
{
    first.SetDrib(1,2);
    second.SetDrib(3,4);
    summ=first+second;
    cout<<summ.chys<<" "<<summ.znam<<endl;
    getch();
    return 0;
}
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
13.06.2012, 22:08     Простая перегрузка оператора #3
Если оператор - член класса, то по умолчанию первый аргумент передаётся через this. Здесь же внутри класса такой оператор не объявлен, объявлен как дружественный внешний оператор сложения. А вот реализуется не внешний оператор, а член класса. Далее, оператор сложения не должен модифицировать аргументы, он должен создавать новое значение (то есть, возвращать не ссылку, а новый объект):
C++
1
2
3
4
5
6
7
8
9
10
11
12
Drib operator+(const Drib& lhs, const Drib& rhs)
{
// За такое сложение дробей надо оставлять на второй год без разговоров
  Drib rv(lhs);
  rv.chys += rhs.chys;
  rv.znam += rhs.znam;
// Правильно будет так:
// Drib rv;
// rv.SetDrib(lhs.chys*rhs.znam + rhs.chys*lhs.znam, lhs.znam * rhs.znam);
// rv.Simplify();  // Сократить полученную дробь
  return rv;
}
Yandex
Объявления
13.06.2012, 22:08     Простая перегрузка оператора
Ответ Создать тему
Опции темы

Текущее время: 23:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru