7 / 7 / 2
Регистрация: 31.08.2011
Сообщений: 135
1

Переопределение операций

08.12.2014, 18:39. Показов 426. Ответов 3
Метки нет (Все метки)

Люди, помогите разобраться, не совсем все понимаю. Эта программа представляет класс комплексных чисел с переопределенными функциями сложения, вычитания, потоком ввода и вывода. Собственно сам вопрос: зачем мы создаем дружественные классы и зачем мы для каждого переопределения создаем 3 метода?

C++ (Qt)
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
class Complex
{
    double x, y;
 
    friend ostream& operator<<(ostream&, const Complex&);
    friend istream& operator>>(istream&, Complex&);
 
public:
 
    Complex(double x = 0, double y = 0)
    {
        this->x = x;
        this->y = y;
    }
 
    Complex operator+(const Complex &other)
    {
        return Complex(this->x + other.x, this->y + other.y);
    }
 
    Complex operator+(const double &other)
    {
        return Complex(this->x + other, this->y);
    }
 
    friend Complex operator+(const double&, const Complex&);
 
    Complex operator-(Complex &other)
    {
        return Complex(this->x - other.x, this->y - other.y);
    }
 
    Complex operator-(const double &other)
    {
        return Complex(this->x, this->y);
    }
 
    friend Complex operator-(const double&, const Complex&);
};
 
ostream& operator<<(ostream& cout, const Complex& complex)
{
    return cout << complex.x << " + i * " << complex.y;
}
 
istream& operator>>(istream& cin, Complex &complex)
{
    return cin >> complex.x >> complex.y;
}
 
Complex operator+(const double &first, const Complex &second)
{
    return Complex(second.x + first, second.y);
}
 
Complex operator-(const double &first, const Complex &second)
{
    return Complex(second.x - first, second.y);
}
 
 
void TestComplex()
{
    Complex a;
 
    cout << "Введите a: " << endl;
    cin >> a;
 
    cout << "10 + a + 12 = " << 10.0 + a + 12.0 << endl;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2014, 18:39
Ответы с готовыми решениями:

Переопределение операций
У меня есть класс, который хранит коэффициенты полинома, вычисляет его. Я попытался добавить...

Переопределение операций
Ситуация такая. В классе матриц переопределён оператор взятия индекса: float operator() (int...

Переопределение операций
Здравствуйте, необходимо осуществить переопределение операции сложения, не понимаю как применять на...

Переопределение операций
Арифметику класса реализовать в виде стандартного набора переопределенных операций с...

3
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
08.12.2014, 18:58 2
Цитата Сообщение от ed8009 Посмотреть сообщение
зачем мы создаем дружественные классы и зачем мы для каждого переопределения создаем 3 метода?
Я вообще не знаю зачем юзают дружественные классы, если хороший код можно написать и без них. Это вопрос только к автору.
0
Эксперт С++
3211 / 1738 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
08.12.2014, 20:01 3
C++
1
2
3
4
5
6
7
8
9
10
11
    Complex operator+(const Complex &other)
    {
        return Complex(this->x + other.x, this->y + other.y);
    }
 
    Complex operator+(const double &other)
    {
        return Complex(this->x + other, this->y);
    }
 
    friend Complex operator+(const double&, const Complex&);
Ну, здесь автор пытался предусмотреть случай, когда одно из слагаемых имеет тип double.
На самом деле здесь достаточно одного оператора:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::complex<double>    T_complex;
/////////////////////////////////////////////////////////////////////////////////////////
class Complex
{
    //-----------------------------------------------------------------------------------
    double x_, y_;
    //-----------------------------------------------------------------------------------
    friend  std::ostream    &   operator<<
        (
            std::ostream        &   ostr,
            Complex     const   &   c
        )
    {
        ostr    <<  T_complex   (
                                    c.x_,
                                    c.y_
                                );
 
        return  ostr;
    }
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    Complex (
                double x = 0,
                double y = 0
            )
        :
        x_(x),
        y_(y)
    {}
    //-----------------------------------------------------------------------------------
    friend  Complex     operator+
        (
            const   Complex     &   L,
            const   Complex     &   R
        )
    {
        return Complex  (
                            L.x_ + R.x_,
                            L.y_ + R.y_
                        );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::cout   <<  Complex(1,2) + Complex(3,4)
                <<  std::endl
                <<  Complex(1,2) + 1
                <<  std::endl
                <<  10 + Complex(3,4)
                <<  std::endl;
 
    system("pause");
}
1
7 / 7 / 2
Регистрация: 31.08.2011
Сообщений: 135
08.12.2014, 23:13  [ТС] 4
Спасибо большое!


А почему через const мы переопределяем операции?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2014, 23:13

Переопределение операций - значки
Мне вот преподаватель сказал, что можно переопределить любую операцию, знак которой определяется не...

Переопределение стандартных операций
Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а — числитель, b —...

Переопределение операций со строками
Операция переопределения Замена в строке первых n символов на символ с наименьшим кодом из входящих...

Переопределение операций сложения, инкремента
Лабораторная работа 2 Тема: Переопределение операций. Дружественные функции. Задания на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru