С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

13.06.2012, 21:37. Просмотров 651. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Простая перегрузка оператора (C++):

перегрузка оператора () - C++
Вопрос заключается в следующем: - Что собой представляет перегружаемый оператор()? - Как его перегрузить? ( обычные операторы тип ++ и...

Перегрузка оператора [] - C++
Создал класс в котором массив указателей на другой класс, перегрузил оператор взятия индекса следующим образом: h-файл #ifndef...

Перегрузка оператора - C++
#include &lt;iostream&gt; class Node { public: char *s; int length; Node * next; public: Node(); Node(char* val) {

Перегрузка оператора - - C++
В своём классе я перегрузил оператор -,но в функции,использующей вычитание возникает ошибка error C2678: бинарный &quot;-&quot;: не найден...

Перегрузка оператора % - C++
Подскажите пожалуйста как перегрузить оператор % для матрицы! #include &quot;StdAfx.h&quot; #include &quot;statik.h&quot; #include &lt;iostream&gt; ...

Перегрузка оператора == - C++
Есть шаблонный класс List (не имеющий перегруженных операторов) и есть шаблонный класс ListWithName, который наследует List и из своих...

2
Andrey.K
343 / 264 / 15
Регистрация: 14.11.2010
Сообщений: 482
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;
}
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 22:08
Привет! Вот еще темы с ответами:

Перегрузка оператора ++ - C++
выводит не то значение привет. нужна Ваша подсказка. листинг из учебника: (тема: перегрузка оператора ++) #include &lt;iostream&gt; ...

Перегрузка оператора [] - C++
Возможно ли создать два перегруженных оператора индексации, чтобы один из них возвращал l-value, другой r-value? В этом примере в обоих...

Перегрузка оператора - C++
Есть такой вот код: #include &lt;iostream&gt; using namespace std; template &lt;class T&gt; class LIST { T field; unsigned long long int...

Перегрузка оператора == - C++
нужно сравнить 1) объект класса abc с объектом класса abc1 2) объект класса abc с другим объектом класса abc 3) объект класса abc1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.