Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
1

Надо переделать метод класса.

17.12.2009, 22:29. Просмотров 716. Ответов 6
Метки нет (Все метки)

Есть программа, надо переделать метод класса. Все - в описании.

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
#include <iostream>
using namespace std;
 
class Complex
{
    public:
        int real;
        int imaginary;
    Complex operator+(long x) const;
};
 
void Complex operator+(long x) const            // Вот этот
{                           // метод класса
    x += real;                  // надо
    x += imaginary;                 // как-то
}                           // переделать, ...      (ниже)
 
int main()
{
    long x = 18;
    Complex C1;
    C1.real = 4;
    C1.imaginary = 5;
    C1 + x;                     // чтобы х стало 27 (18+4+5)
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2009, 22:29
Ответы с готовыми решениями:

Вызвать из переменной класса-внука метод из класса-деда
Решено. Ответ внизу добавил. _____________________________________________________ Описание...

Как переделать friend-перегрузки ввода/вывода в метод класса?
Доброго времени суток! Есть вопрос: как переделать френдовые перегрузки ввода\вывода в метод...

Как передать в метод класса Menu указатель на метод дочернего класса?
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: ...

В C++ метод производного класса всегда переопределяет метод базового класса?
#pragma once #include &lt;iostream&gt; using namespace std; class Fish { public: virtual...

6
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
18.12.2009, 01:19 2
перегрузи оператор +=

тогда запись типа:
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
C1 + x;
можно записать как:
x += C1;
1
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
18.12.2009, 13:32  [ТС] 3
>> niXman
Спасибо, навели на правильную мысль.

Я доделал класс и вот, что получилось:

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
#include <iostream>
using namespace std;
 
class Complex
{
    public:
        int real;
        int imaginary;
    void operator+(long x) const;
};
 
void
Complex::operator+(long x) const
{
    x += real;
    x += imaginary;
    cout << x;
}
 
int main()
{
    long x = 18;
    Complex C1;
    C1.real = 4;
    C1.imaginary = 5;
    C1 + x;
    cout << endl;
    return 0;
}
0
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 14:06 4
вот тебе почти полноценное описание класса действительных чисел, даже поераторы << перегружены. сделай свой класс по образу и подобию.
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
//создание класса INT - класса натуральных чисел.
#include <iostream>
#include <conio.h>
using namespace std;
 
class INT {
      private:
              int i;
      public:
             INT(){i=0;cout <<"use INT()\n";}
             INT(int ii){i=ii;cout <<"use INT(int)\n";}
             // если в следующий оператор передавать аргумент по ссылка, то обычное число туда не войдет :), типа (int &ii)
             INT &operator=(const int ii){i=ii;cout <<"use INT=(const int)\n"; return *this; } //aa@bb aa.operator@(bb);
             INT &operator=(const INT &I){if (this!=&I)this->i=I.i;cout <<"use INT=(const INT)\n";}
             //аксессор, оне не нужен, ибо функйци которые могли бы в нем нуждаться обявлены дружественными классу INT.
             //int get()const{return i;}
             
             //без этого оператора, в a=c+3 использовался бы не он, а тот что ниже него.
             INT &operator+(int ii){INT*p=new INT(ii+i); cout <<"use INT+(int)\n";return *p;}
             //создание обектов в динамической памяти - очень важно. Так мы не портим сами обьекты из которых вызывались операторы.
             // что бы не испортить A: INT A(x); INT B(y); INT C; C=A+B; вернем в C ссылку на обект в динамической памяти.
             INT &operator+(INT &I){INT*p=new INT(i+I.i);cout <<"use INT+(INT)\n";return *p;}
             
             //префиксный инкремент, aa.operator++();, без входного аргумента все операторы префиксные по умолчанию.
             INT &operator++(){i+=1;cout <<"use INT++()\n";return *this;}
             //постфиксный инкремент, aa.operator++(bb); оба оператора возвращают себя, иначе невозможно j=i++.
             INT &operator++(int ii){i+=1;cout <<"use INT++(int)\n";return *this;}
             
             INT &operator*(int ii){INT*p=new INT(i*ii); cout <<"use INT*(int)\n"; return *p;}
             INT &operator*(INT &I){INT*p=new INT(i*I.i);cout <<"use INT*(INT)\n"; return *p;}
             
             INT &operator-(int ii){INT*p=new INT(ii-i);cout <<"use INT-(int)\n";return *p;}
             INT &operator-(INT &I){INT*p=new INT(i-I.i);cout <<"use INT-(INT)\n";return *p;}
             
             INT &operator--(){i-=1;cout <<"use INT--()\n";return *this;}
             INT &operator--(int ii){i-=1;cout <<"use INT--(int)\n";return *this;}
             
             INT &operator/(int ii){INT*p=new INT(i/=ii); cout <<"use INT/(int)\n"; return *p;}
             INT &operator/(INT &I){INT*p=new INT(i/=I.i); cout <<"use INT/(int)\n"; return *p;}
             
             operator int(){cout <<"use int()\n";return i;}
             
             //унарынй префексный * возвращает ссылку как и положено.
             INT * operator*(){cout <<"use INT* *()\n";return this;}
             
             //унарные минус
             INT &operator-(){INT*p=new INT(-i); cout <<"use INT-()\n";return *p;}
             
             friend int operator+(int i, INT &I);
             friend int operator*(int i,INT &I);
             friend int operator-(int i, INT &I);
             friend int operator/(int i,INT &I);
             friend istream &operator>>(istream & in,const INT &I);
             friend ostream &operator<<(ostream &out,const INT &I);
};
//этот оператор лучше, потому что универсальние, он полезен при int = int + INT;
int operator+(int i, INT &I)
{
    cout << "nic int+(int,INT)\n";
    return i+I.i;//имеем доступ к закрытым полям, ибо оператор обьявлен дружестыенным к классу INT
}
//а этот оператор только при INT = int + INT
/*
INT operator+(int i, INT &I)
{
    cout << "nic INT=(int,INT)\n";
    return INT(i+I.get());
}*/
int operator*(int i,INT &I)
{
    cout << "nic int*(int,INT)\n";
    return i*I.i;
}
 
int operator-(int i, INT &I)
{
    cout << "nic int-(int,INT)\n";
    return i-I.i;
}
 
int operator/(int i,INT &I)
{
    cout << "nic int/(int,INT)\n";
    return (int)i/I.i;
}
istream &operator>>(istream & in,const INT &I)
{
        in >> I.i;
        return in;
}
ostream &operator<<(ostream &out,const INT &I)
{
        out << I.i;
        return out;
}
 
//эту функцию лекго можно использовать для вычисления обьектов INT, благодая перегруженным int() и оператору присваивания INT=int.
//непосредственно в рекурсии будет участвровать только int числа.
int fuc(int i)
{
    if(i)return i*fuc(i-1);
    else return 1;
}
 
//если передавать в pow() аргумент про ссылкие, типа так pow(INT &I), 
//то конструктр не сможет создать временный обьект из числа типа int, pow(4) например не сработает.
INT pow(INT I)
{
    return I*I;
}
 
int main()
{
    //#define int INT // %)
    cout << "1 INT a; ";        INT a;
                                cout <<"a="<< a << endl;
    cout << "2 INT b(6); ";     INT b(6);
                                cout << "b="<<b << endl;
    cout << "3 INT c=b; ";      INT c=b;//здесть используется не перегруженный оператор =, а стандартный.
                                cout << "Standart =\n";
                                cout << "c="<<c << " d=" << b << endl;
    cout << "4 a=c; ";          a=c;
                                cout << "a="<< a <<" c="<< c << "\n";
    cout << "5 INT d=2 ";       INT d=2;
                                cout << "d=" << d << endl;
    cout << "6 a=c+3; ";        a=c+3;
                                cout << "a=c+3, a=" << a << endl;
    cout << "7 b=3+a ";         b=3+a;
                                cout << "b=3+a, b=" << b << endl;
    cout << "8 d=a+b ";         d=a+b;
                                cout << "d=" << d << endl; 
    cout << "9 int i=23; ";     int i=23;
    cout << "10 d+i ";          d+i;
                                cout << "d=" << d << endl;
                                cout << "befor X++, a=" << a << endl;
    cout << "11 a++ ";          a++;
                                cout << "after X++, a=" << a << endl;
 
                                cout << "befor ++X, a=" << a << endl;
    cout << "11 ++a ";          ++a;
                                cout << "after ++X, a=" << a << endl;
 
                                a=3; b=1; c=0; d=-2; i=10;
                                cout << "a=3; b=1; c=0; d=-2; i=10;\n";
                                
    cout << "12 c=a*3+i; ";     c=a*3+i;
                                cout << "a=" << a << " c=" << c << " i=" << i << endl;
                                cout << "for culc (c+b)*i+(d*2) was don: \n";
                                cout << "(c+b)*i-(d*2)=" << (c+b)*i-(d*2) << endl;
    cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << " i=" << i << endl;
    cout << "13 a=4*d; ";       a=4*d;
                                cout << "a=" << a << endl;
cout << "14 d=(a/b)*(c/3); ";   d=(a/b)*(c/3);
                                cout << "d=" << d << endl;
    cout << "15 i=3/b; ";       i=3/b;
                                cout << "i=" << i <<endl;
    cout << "16 i=8+b; ";       i=8+b;
                                cout << "i=" << i <<endl;
    cout << "17 i=b+1; ";       i=b+1; //очень тонкое место... здесь используется перегруженный int();
                                cout << "i=" << i <<endl;
    cout << "b=1,c=0,c=b++\n";  b=1;
                                c=0;
                                c=b++;
                                cout << "c=" << c << endl;
                                
                                cout<< "d=4;"<< endl;
                                d=5;
                                cout << "fuc cuclc\n";
                                //int fuc(int);
                                cout << "fuc(d)=" << fuc(d) << endl;
    cout << "18 c=fuc(d); ";    c=fuc(d);
                                cout << "c=" << c << endl;
                                
                                INT *IP;
                                const int max=5;
                                INT I[max];
                                for(int i=0;i!=max;i++)I[i]=i;
                                IP=I;
                                for(INT i=0;i!=max;i++)//здесь INT i в роле счетчика!!!! :)
                                {
                                        cout << "*IP ppoint to I[" << i << "]=" << *IP << endl;
                                        IP++;
                                }
    cout << "19 IP=*d; ";       IP=*d; // пример использования унарного *
                                cout << "*IP=" << *IP << endl;
                                
                                INT *IPnum=new INT[max];
                                for(INT i=0;i!=max;i++){IPnum[i]=(i + I[4-i]);}
                                
                                for(int i=0;i!=max;i++)cout << I[i] <<" " << *IPnum[i] <<"->" <<*IPnum++<< endl;
    cout << "sizeof(INT)=" << sizeof(INT) << "  sizeof(int)=" << sizeof(int) << "  sizeof(IP)=" << sizeof(IP)<< endl;
    int im[max];
    cout << "sizeof(I)=" << sizeof(I) << "  sizeof(im)=" << sizeof(im) <<"  sizeof(IPnum)=" << sizeof(IPnum)<< endl;
    delete [] IPnum;
    
                                cout << "c=" << c << endl;
    cout << "20 d=pow(c); ";    d=pow(c);
                                cout << "d=" << d << endl;
                                //INT pow(INT);
    cout << "21 int j=pow(4); ";int j=pow(4);
                                cout << "j=" << j << endl;
                                
                                
    cout << "22 INT AA=5; ";    INT AA=5;
    cout << "23 INT BB=4; ";    INT BB=4;
    cout << "24 INT CC; ";      INT CC;
                                cout << "CC=" << CC <<" AA=" << AA << " BB=" << BB << endl;
                                CC=AA+BB;
                                cout << "CC=" << CC <<" AA=" << AA << " BB=" << BB << endl; 
                                
    cout << "25 AA=BB-CC; ";    AA=BB-CC;
                                cout << "CC=" << CC <<" AA=" << AA << " BB=" << BB << endl;
    cout << "26 CC=-AA; ";      CC=-AA;
                                cout << "CC=" << CC <<" AA=" << AA << endl;
    cout << "27 BB=AA*(-AA); "; BB=CC*(-AA);
                                cout << "CC=" << CC <<" AA=" << AA << " BB=" << BB << endl;
                                CC=AA=BB=0;
                                cout << "CC=" << CC <<" AA=" << AA << " BB=" << BB << endl;
 
    getch();
}
только сотри cout из реализации перегрузки операторов, они там чтобы на кран выводилось какой оператор используется.
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.12.2009, 14:19 5
Aye Aye, утечек памяти тут у тебя.... мама не горюй!
0
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 16:30 6
CheshireCat можно один пример из кода, и как избавиться? delete? это OVERPOWER8у тоже поможет.
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.12.2009, 22:28 7
Ну, вот как следовало бы написать сложение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
INT operator+(const INT &I) const
{
    INT temp(*this);
    temp += I;
    return temp;
}
 
INT& operator+=(const INT &I)
{
    i += I.i;
    return *this;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2009, 22:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

надо переделать
Надо сделать чтобы массив вводился с клавиатуры скиньте правильный код очень срочно надо буду...

надо переделать
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace std; class...

надо переделать программу
помогите переделать программу нужно было из это программы: #include &quot;stdafx.h&quot; #include...

Надо переделать программу из С на С++
Я не особо шарю в это, помогите пожалуйста, код рабочий все хорошо, надо его просто переделать под...


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

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

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