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

Перегрузка операторов (на примере +) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Lerby
3 / 3 / 0
Регистрация: 30.05.2013
Сообщений: 53
23.04.2014, 23:28     Перегрузка операторов (на примере +) #1
Здравствуйте! Возникла небольшая проблема при перегрузке операторов.
Есть некий класс, который должен складываться как сам с собой, так и с int.
Делать,
C++
1
2
const CClass operator + (const CClass &other)const;
const CClass operator + (const int &other)const;
как мне кажется, не хорошо...

можно ли сделать как то только через
C++
1
const CClass operator + (const CClass &other)const;
пытался сделать что то в таком духе (сильно не пинайте):
C++
1
operator CClass(const int &other)const;
но не вышло

есть ли какие либо способы провернуть подобную вещь?)

Добавлено через 4 минуты
PS Для примера, пусть в самом классе будет только 1 приватная переменная int.

Добавлено через 14 минут
PPS Если задать вопрос в двух словах, то будет звучать так:
Возможна ли реализация перегрузки функции сложения так, что бы она работала с несколькими типами?
т.е., например, с CClass и int одновременно при единственной перегрузке:
C++
1
const CClass operator + (const CClass &other)const;
т.е. что бы отправляемый int автоматически перевелся в CClass.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 23:28     Перегрузка операторов (на примере +)
Посмотрите здесь:

Перегрузка операторов C++
C++ Перегрузка операторов с++
C++ C++ перегрузка операторов
C++ Перегрузка операторов
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lartsevich
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 00:11     Перегрузка операторов (на примере +) #2
Здравствуйте) подпишусь под эту тему, у меня та же проблема, только конкретно с классом комплексных чисел.
Надо, чтобы можно было делать такое присваивание:
C++
1
2
3
Complex val1(3,5);   // 3+5*i;
Complex val2;
val2 = val1 + 7;  // по идее должно быть 10+5*i
Есть перегрузка чисто сложения комплексных чисел и присваивания:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Complex operator + (Complex &c) // перегрузка оператора сложения
   {
      Complex temp;
 
      temp.re = re + c.re;
      temp.im = im + c.re;
 
      return temp;
   }
 
 Complex & operator = (Complex &c) // перегрузка оператора присваивания
   {
      re = c.re;
      im = c.im;
 
      return (*this);
   }
Также есть перегрузка и сложения и присваивания только для действительного числа (т.е. к комплексному прибавляем или присваиваем действительное)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Complex operator + (double x) //прибавление действительного числа
   {
       Complex temp;
           temp.re = re+x;
           temp.im = im;
           return temp;
   }
Complex & operator = (double x) // перегрузка оператора присваивания
      {
         re = x;
         im = 0;
         return (*this);
      }
хочется сделать что-то вроде

C++
1
2
3
4
5
6
7
Complex operator + (Complex &c, double x) //прибавление действительного и комплексного числа
     {
       Complex temp;
           temp.re = re+c.re+x;
           temp.im = im+c.im;
           return temp;
     }
но разумеется так нельзя, ошибка: error: 'Complex Complex::operator+(Complex&, double)' must take either zero or one argument

Присоединяюсь к просьбе о помощи)
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
24.04.2014, 00:21     Перегрузка операторов (на примере +) #3
Lerby, насчет "перевелся" хз, имхо врядли)
по идее вот так должно работать
C++
1
const CClass operator + (const int &other)const;
ваш клас что хотите то и делаете с ним))

Добавлено через 7 минут
lartsevich, то что вы хотите реализовать
C++
1
val2 = val1 + 7;  // по идее должно быть 10+5*i
у вас уже реализовано, операторами присаваивания и прибавления действительного.
как вы хотите сразу 2 числа прибавить и зачем хз)))) уверены что вам именно это надо?)
lartsevich
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 00:23     Перегрузка операторов (на примере +) #4
Цитата Сообщение от newb_programmer Посмотреть сообщение

Complex operator + (double x) //прибавление действительного и комплексного числа
{
re = re+c.re+x;
im = im+c.im;
return *this;
}
Тогда при вычислении получается так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Complex operator + (double x) //прибавление действительного и комплексного числа
        {   Complex c;
             re = re+c.re+x;
              im = im+c.im;
              return *this;
        }
 
int main()
{
.....
Complex value1(3,5);
    Complex value2;
value2 =  value1 + 7;
    cout<<value2;
return 0;
}
//error: no match for 'operator=' in 'value2 = Complex::operator+(double)(7.0e+0)'
Lerby
3 / 3 / 0
Регистрация: 30.05.2013
Сообщений: 53
24.04.2014, 00:23  [ТС]     Перегрузка операторов (на примере +) #5
newb_programmer, так работает) просто мне надо перегрузить 10+ операторов, по этому хотел узнать, есть ли более рациональный способ, который поможет сократить код)
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
24.04.2014, 00:28     Перегрузка операторов (на примере +) #6
lartsevich, а если перегрузку присваивания для действительного убрать?
lartsevich
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 00:37     Перегрузка операторов (на примере +) #7
newb_programmer, увы, та же самая ошибка (
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
24.04.2014, 00:43     Перегрузка операторов (на примере +) #8
lartsevich, код в студию...все должно работать! я вот не поленился нашел старую лабу с комплексными числами))))) и у меня все работает
C++
1
2
3
4
Complex A(1,2);
    Complex D=A+5;
    A.Print();
    D.Print();
вывод:
1 + 2 * i

6 + 2 * i

Для продолжения нажмите любую клавишу . . .
lartsevich
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 00:47     Перегрузка операторов (на примере +) #9
newb_programmer, спасибо, что помогаете)

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
#include <cstdio>
#include <cmath>
 
using namespace std;
class Complex // класс комплексных чисел
{ public:
   double re, im; // целая и мнимая части
 
// создаем конструкторы
public:
 
   Complex() {};
 
   Complex (double r) // конструктор по умолчанию
   {
      re = r;
      im = 0;
   }
 
   Complex (double r, double i) // конструктор по умолчанию
   {
      re = r;
      im = i;
   }
 
   Complex (Complex &c) // конструктор копирования
   {
      re = c.re;
      im = c.im;
   }
 
   ~Complex() {}
 
   float abs() // Модуль комплексного числа
   {
      return sqrt(re * re - im * im);
   }
 
   Complex & operator = (Complex &c) // перегрузка оператора присваивания
   {
      re = c.re;
      im = c.im;
 
      return (*this);
   }
 
   Complex & operator = (double x) // перегрузка оператора присваивания
      {
         re = x;
         im = 0;
         return (*this);
      }
 
   Complex operator + (Complex &c) // перегрузка оператора сложения
   {
      Complex temp;
 
      temp.re = re + c.re;
      temp.im = im + c.re;
 
      return temp;
   }
 
   Complex operator - (Complex &c) // перегрузка оператора вычитания
   {
      Complex temp;
 
      temp.re = re - c.re;
      temp.im = im - c.re;
 
      return temp;
   }
 
   Complex operator * (Complex &c) // перегрузка оператора умножения
   {
      Complex temp;
 
      temp.re = re*c.re;
      temp.im = re*c.im;
 
      return temp;
   }
 
   Complex operator / (Complex &c) // перегрузка оператора деления
   {
      Complex temp;
 
      double r = c.re * c.re + c.im * c.im;
      temp.re = (re * c.re + im * c.im) / r;
      temp.re = (im * c.re - re * c.im) / r;
 
      return temp;
   }
   Complex operator + (double x) //прибавление действительного числа
   {
       Complex temp;
           temp.re = re+x;
           temp.im = im;
           return temp;
   }
 
    Complex operator -(double val) //вычитание действительного числа
   {
       Complex ret_val;
       ret_val.re = re-val;
       ret_val.im = im;
       return ret_val;
   }
 
  Complex operator *(double val) //умножение на действительное число
   {
       Complex ret_val;
       ret_val.re = re*val;
       ret_val.im = im*val;
       return ret_val;
   }
 
   Complex operator /(double val) //деление на действительное число
   {
       Complex ret_val;
       ret_val.re = re/val;
       ret_val.im = im/val;
       return ret_val;
   }
 
   friend ostream &operator<<(ostream &, Complex &); // перегрузка оператора <<
   friend istream &operator>>(istream &, Complex &); // перегрузка оператора >>
 
};
 
ostream &operator<<(ostream &out, Complex &c)
{
   out << "(" << c.re << ") + I (" << c.im << ")"<<"\n";
 
   return out;
}
 
istream &operator>>(istream &in, Complex &c)
{
   in >> c.re >> c.im;
 
   return in;
}
Complex pow_z_n (Complex z, double n)  //формула Муавра - возведение в степень
   {
       double r = sqrt(z.re*z.re + z.im*z.im);
       double fi = atan(z.im / z.re);
       Complex zn (pow(r,n)*cos(n*fi), pow(r,n)*sin(n*fi));
       return zn;
   }
 
int main()
{
    int k=10, n=10;
    const double pi = 3.14159265;
    Complex value1(3,5);
    Complex value2;
    Complex z[k][n];
       for (int i=1;  i<=k; i++)
        {for (int j=1; j<=n; j++)
            {  z[i][j].re = 0.5*cos(2*pi*i/j);
            z[i][j].im = 0.5*sin(2*pi*i/j);
            }
        }
 
 
   //    for (int i=1;  i<=k; i++)
   //           {for (int j=1; j<=n; j++)
    //              cout << z[i][j] << endl;
    //          }
 
//value2 = function(value1);
cout<< value1;
value2 += value1 + 7;
cout<<value2;
    return 0;
}
писала в Eclipse, если что)
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
24.04.2014, 00:52     Перегрузка операторов (на примере +) #10
lartsevich, тоже все работает...=)
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
int main()
{
    int k=10, n=10;
    const double pi = 3.14159265;
    Complex value1(3,5);
    Complex value2;
   /* Complex z[k][n];
       for (int i=1;  i<=k; i++)
        {for (int j=1; j<=n; j++)
            {  z[i][j].re = 0.5*cos(2*pi*i/j);
            z[i][j].im = 0.5*sin(2*pi*i/j);
            }
        }*/
 
 
   //    for (int i=1;  i<=k; i++)
   //           {for (int j=1; j<=n; j++)
    //              cout << z[i][j] << endl;
    //          }
 
//value2 = function(value1);
    cout<< value1;
    value2= value1 + 7;
    cout<<value2;
    system("pause");
    return 0;
}
вывод:
(3) + I (5)
(10) + I (5)
Для продолжения нажмите любую клавишу . . .

Добавлено через 1 минуту
там при создании массива у вас ошибки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 01:45     Перегрузка операторов (на примере +)
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lartsevich
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 01:45     Перегрузка операторов (на примере +) #11
newb_programmer, это очень странно, но я попробовала в вижаке, и заработало)) наверное, что-то не так было с компилятором... в Эклипс больше не полезу. извините за отнятое время и еще раз спасибо за помощь))
Yandex
Объявления
24.04.2014, 01:45     Перегрузка операторов (на примере +)
Ответ Создать тему
Опции темы

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