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

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

Восстановить пароль Регистрация
 
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.09.2012, 16:51     Перегрузка операторов #1
Есть у меня свой тип рациональных дробей, и вот мне надо перегрузить оператор "+" таким образом, что бы работала такая строчка кода
C++
1
Rational d = 2 + b;
, для такого случая:
C++
1
Rational c = a + 2;
у меня есть перегрузка оператора, не могли бы вы подсказать, каким образом перегрузить оператор для целого числа?
Вот весь класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Rational.h 
#include <iostream>
 
using namespace std;
class Rational
{
private:
    int ch,zn;
    void gcd();
public:
    Rational(int);
    Rational(int, int);
    Rational operator+(Rational);
    Rational operator-(Rational);
    Rational operator*(Rational);
    Rational operator/(Rational);
    Rational operator-();//unar
    Rational operator+(int);
    friend ostream& operator<<(ostream& , Rational );
    void print();
 
};
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//Rational.cpp
#include "Rational.h"
#include <iostream>
 
using namespace std;
 
Rational::Rational(int c)
{   
    ch = c; zn = 1;
}
 
Rational::Rational(int c, int z)
{
    if(z < 0)
        ch = -c, zn = -z;
    else
        ch = c, zn = z;
    gcd();
}
 
void Rational::print()
{
    cout << ch << '/' << zn << endl;
}
 
void Rational::gcd()
{
    int b1 = ch, b2 = zn;
    if(b1 < 0)
        b1 = -b1;
    while(b1 != b2)
        if(b1 > b2)
            b1 -= b2;
        else
            b2 -= b1;
    if(b1 != 1)
        ch /= b1,
        zn /= b1;
 
}
 
Rational Rational::operator+(Rational r)
{   
    Rational c(ch, zn);
        
        c.ch *= r.zn;
        r.ch *= c.zn;
        c.zn *= r.zn;
        c.ch += r.ch;//then use gcd() fun
    
    c.gcd();
    return c;
}
 
Rational Rational::operator-(Rational r)
{   
    Rational c(ch, zn);
        
        c.ch *= r.zn;
        r.ch *= c.zn;
        c.zn *= r.zn;
        c.ch -= r.ch;//then use gcd() fun
    
    c.gcd();
    return c;
}
 
Rational Rational::operator*(Rational r)
{
    Rational c(ch,zn);
    
    c.ch *= r.ch;
    c.zn *= r.zn;
    c.gcd();
    return c;
}
 
Rational Rational::operator/(Rational r)
{
    Rational c(ch,zn);
    
    c.ch *= r.zn;
    c.zn *= r.ch;
    c.gcd();
    return c;
}
 
Rational Rational::operator -()
{
    Rational c(-ch, zn);
    return c;
}
 
ostream &operator<<(ostream &c,Rational r)
{
    r.print();
    return c;
}
 
Rational Rational::operator +(int x)
{
    Rational r(ch,zn);
    r.ch += x * r.zn;
    return r;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//main.cpp
#include "Rational.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    Rational a = Rational(5,6);
    Rational b = 3;
    Rational c = a + 2;
    Rational d = 2 + b;
    Rational e = - b - c;
    Rational f = c * 2 * c;
    cout << a << b << c << d << e << f;
    /*Rational a(2,3);
    Rational b(3,4);
    Rational c =  a + b;
    Rational d = a * b * c;
    cout << a << b << c;
    cout << d;*/
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2012, 16:51     Перегрузка операторов
Посмотрите здесь:

C++ Перегрузка операторов(=,+)
C++ Перегрузка операторов С++
C++ перегрузка операторов
C++ Перегрузка операторов
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
05.09.2012, 17:05     Перегрузка операторов #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Rational.h
class Rational
{
    // ......
    friend Rational operator+(int, Rational);
};
 
// Rational.cpp
Rational operator+(int x, Rational r)
{
    return Rational(x) + r;
}
Добавлено через 1 минуту
Да, и лучше во все операторы передавать не Rational, a const Rational& - в том числе, и в operator<<
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.09.2012, 17:17     Перегрузка операторов #3
CheshireCat,

Не по теме:

В данном случае нет необходимости делать функцию другом класса.



Добавлено через 2 минуты
C++
1
2
3
const Rational operator+( int x, Rational r ) {
    return r + x;
}
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.09.2012, 17:51  [ТС]     Перегрузка операторов #4
спасибо большое

Добавлено через 10 минут
а чем ссылка на переменную будет отличаться от просто переменной?

Добавлено через 4 минуты
компилятор ругается на то, что у оператора "+" слишком много параметров, можно как-то все три случая в одну ф-ию объединить?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.09.2012, 18:02     Перегрузка операторов #5
xexew, При передачи по ссылке не создается копия объекта, а передается существующий. При передачи по значению ( в Вашем случае ), создается копия объекта. Если для встроенных типов это нормально, то есть разницы в производительности не будет, то с пользовательскими типами уже будет накладно, особенно если используется динамическая память.

Ваши файлы должны выглядеть примерно так:
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
#ifndef RATIONAL_H  //используйте стражей включения ( подробно о них можно прочитать на wiki )
#define RATIONAL_H
 
#include <iostream>
 
//using namespace std; - никогда так не делайте в заголовочных файлах
class Rational
{
private:
    int ch,zn;
    void gcd();
public:
    Rational(int);
    Rational(int, int);
    Rational operator+( const Rational & );
    Rational operator-( const Rational & );
    Rational operator*( const Rational & );
    Rational operator/( const Rational & );
    Rational operator-();//unar
    Rational operator+(int);
    friend std::ostream& operator<<( std::ostream& , const Rational & );
    void print();
 
};
 
Rational operator+( int, const Rational & );
 
#endif
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "Rational.h"
#include <iostream>
 
using namespace std; //вот здесь уже можно использовать
 
Rational::Rational(int c)
{   
    ch = c; zn = 1;
}
 
Rational::Rational(int c, int z)
{
    if(z < 0)
        ch = -c, zn = -z;
    else
        ch = c, zn = z;
    gcd();
}
 
void Rational::print()
{
    cout << ch << '/' << zn << endl;
}
 
void Rational::gcd()
{
    int b1 = ch, b2 = zn;
    if(b1 < 0)
        b1 = -b1;
    while(b1 != b2)
        if(b1 > b2)
            b1 -= b2;
        else
            b2 -= b1;
    if(b1 != 1)
        ch /= b1,
        zn /= b1;
 
}
 
Rational Rational::operator+( const Rational &r )
{   
    Rational c(ch, zn);
        
        c.ch *= r.zn;
        r.ch *= c.zn;
        c.zn *= r.zn;
        c.ch += r.ch;//then use gcd() fun
    
    c.gcd();
    return c;
}
 
Rational Rational::operator-(const Rational &r)
{   
    Rational c(ch, zn);
        
        c.ch *= r.zn;
        r.ch *= c.zn;
        c.zn *= r.zn;
        c.ch -= r.ch;//then use gcd() fun
    
    c.gcd();
    return c;
}
 
Rational Rational::operator*(const Rational &r)
{
    Rational c(ch,zn);
    
    c.ch *= r.ch;
    c.zn *= r.zn;
    c.gcd();
    return c;
}
 
Rational Rational::operator/(const Rational &r)
{
    Rational c(ch,zn);
    
    c.ch *= r.zn;
    c.zn *= r.ch;
    c.gcd();
    return c;
}
 
Rational Rational::operator -()
{
    Rational c(-ch, zn);
    return c;
}
 
ostream &operator<<(ostream &c,const Rational &r)
{
    r.print();
    return c;
}
 
Rational Rational::operator +(int x)
{
    Rational r(ch,zn);
    r.ch += x * r.zn;
    return r;
}
 
const Rational operator+( int x, const Rational &r ) {
    return r + x;
}
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
05.09.2012, 18:08  [ТС]     Перегрузка операторов #6
все понятно, только подумал что это ф-ия глобальная, спасибо

Добавлено через 1 минуту
про стражей я и позабыл, когда в qt писал они сами добавлялись, а сейчас на ms vs пишу, а он так не умеет)
Yandex
Объявления
05.09.2012, 18:08     Перегрузка операторов
Ответ Создать тему
Опции темы

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