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

C++

Войти
Регистрация
Восстановить пароль
 
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
#1

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

17.12.2009, 22:29. Просмотров 492. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
18.12.2009, 01:19     Надо переделать метод класса. #2
перегрузи оператор +=

тогда запись типа:
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
C1 + x;
можно записать как:
x += C1;
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 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;
}
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 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 из реализации перегрузки операторов, они там чтобы на кран выводилось какой оператор используется.
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
18.12.2009, 14:19     Надо переделать метод класса. #5
Aye Aye, утечек памяти тут у тебя.... мама не горюй!
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 16:30     Надо переделать метод класса. #6
CheshireCat можно один пример из кода, и как избавиться? delete? это OVERPOWER8у тоже поможет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2009, 22:28     Надо переделать метод класса.
Еще ссылки по теме:

Надо переделать немного программу C++
Вызвать из переменной класса-внука метод из класса-деда Visual C++
Указатель на метод класса в качестве аргумента метода класса C++
Надо переделать программу из матлаб в С++ C++

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
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;
}
Yandex
Объявления
18.12.2009, 22:28     Надо переделать метод класса.
Ответ Создать тему
Опции темы

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