| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Разработка основы класса |
| Автор: DENAT 3.12.2007, 16:32 |
| Мне надо немного переделать код проги #include<iostream.h> #include<conio.h> #include "COMPLEX1.H" Complx::Complx(double n,double m) { a=n; b=m; } Complx::Complx(const Complx&z) { a=z.a; b=z.b; } Complx::Complx() { a=0;b=0; } Complx& Complx::operator=(const Complx& z) { a=z.a; b=z.b; return *this; } Complx& Complx::operator+( Complx& z) { Complx *temp; temp->a=a+z.a; temp->b=b+z.b; return *temp; } Complx& Complx::operator-( Complx& z) { Complx *temp; temp->a=a-z.a; temp->b=b-z.b; return *temp; } ostream & operator<<(ostream &out,Complx const &z) { out << z.a << "+"<<z.b<<"i\n"; return out; } istream & operator>>(istream &in,Complx &z) { in>>z.a>>z.b; return in; } Complx::Complx(double qwe) { a=qwe; b=0; } Собственно надо исправить в выделенном коде,что бы было без temp(мне сказали что я сделал неправильно)!!!!!!!!!! И если не трудно помогите со след.заданием... Разработать и реализовать в виде перегруженных операций арифметику класса: сложение, вычитание, умножение, сравнение, изменение отдельных частей и получение /изменение параметров объектов Разработать конструктор копирования, переопределить операции присваивание, доп. присваивания, сравнение, ввод/вывод в стандартные потоки. Это задание надо сделать в этой же проги.!!!!!!!! Вот осталные файлы от проекта... файл comlex1.h #ifndef __COMPLEX1_H #define __COMPLEX1_H class Complx { public: friend ostream & operator<<(ostream &out,Complx const &z); friend istream & operator>>(istream &in,Complx &z); Complx& operator=(const Complx& z); Complx& operator+( Complx&); Complx& operator-( Complx&); Complx(double a,double b); Complx(const Complx&); Complx(double qwe); Complx(); protected: double a,b; }; #endif и файл main.cpp #include<iostream.h> #include<conio.h> #include "COMPLEX1.H" void main() { clrscr(); Complx a; Complx b; Complx c; cout<<"Vvedite Complexnoe chislo A:"; cin>>a; cout<<"Vvedite Complexnoe chislo B:"; cin>>b; c=a+5; cout<<c; c=a-5; cout<<c; getch(); } Если найдете ошибки и недочеты исправте пожалусто!!!!!! Всем зарание спасибо!!!!! |
| Автор: DENAT 3.12.2007, 16:52 |
| А что тогда мог иметь введу преподователь когда сказал что temp тут не к месту???? |
| Автор: zkv 3.12.2007, 17:03 | ||||||||||
не знаю, что он имел ввиду, у тебя в этом коде
Возможно препод не заметил этого и воспринял твой код как:
а это очень частонаступаемые новичками грабли - передаем ссылку на локальную переменную. Те как только вышли из функции, она перестала существовать, и дальше ее использовать нельзя. если же мы поступим так:
то это вполне законно. Но проблема появляется - когда освобождать память, и кто этим должен заниматься. Лучше поступить так, как я показал в предыдущем посте. Добавлено через 4 минуты и 25 секунд ну или более лаконично:
ну и еще есть вариант через operator+= |
| Автор: baldina 5.12.2007, 22:52 | ||||||||
Вобщем так. Имеем:
Сие уже неграмотно, т.к. мы можем писать
Но не можем
потому что operator+ - член класса. Вообще такие операторы обычно делают свободными функциями и реализуют через оператор вида оп=
Замечу, что свободной функции operator+ не требуется доступ в закрытую часть класса. Про temp: стандарт C++ разрешает оптимизировать такие временные переменные (что некоторые продвинутые компиляторы, например VC++ 2005+ и делают). Добавлено через 7 минут и 45 секунд Complx& Complx::operator+( Complx&); - это вообще непонятно. Получается, что этот оператор модифицирует объект, для которого вызывается, и возвращает ссылку на себя. Т.е. ведет себя фактически как += Тогда логично и делать его += что бы не нарушать семантику и не путать пользователя. Если это не так (т.е. предполагается общепринятая семантика), то должно быть Complx& Complx::operator+(Complx&) const; В этом случае непонятно, ссылку на что вызвращает оператор. На временный объект? Но это в корне неверно, объект уже разрушен, работать не будет. Приходим к Complx Complx::operator+(Complx&) const; Здесь все хорошо, за исключением вышеупомянутой проблемы: Complx() + 1 работает, а 1 + Complx() - нет. Так что использование operator+=() как функции-члена класса и реализации operator+() как свободной функции (через +=) есть самый лучший вариант. |
| Автор: baldina 6.12.2007, 00:02 | ||||||||
| > Разработать конструктор копирования, переопределить операции присваивание, доп. присваивания, сравнение, ввод/вывод в стандартные потоки. Ясно, что Вам просто предлагают потренироваться, иначе препод - дятел. 1. Конструктор копирования и оператор присваивания в этом классе не нужны. Компилятор их прекрасно создаст сам без Вашего участия. Ну а для тренировки вы прекрасно справитесь сами - все очень похоже на уже готовый конструктор, а интерфейсы Вы написали правильно. 2. Арифметика. Вам показали, как это правильно делать: в классе пределяете += -= *= и т.д., а + - * и т.д. делаете свободными функциями. 3. Сравнение. Для комплексных чисел имхо имеет смысл только проверка равенства и неравенства. Примерно так:
4. Можно для разнообразия добавить получение сопряженного числа, например перегрузив оператор ~
5. Что такое "доп. присваивание" я не понимаю. 6. Каким компилятором Вы пользуетесь? Что за страшные <conio.h>? Выбросьте эту отрыжку DOS и используйте вместо getch() cin.get() 7. Препод будет доволен, если Вы реализуете функции доступа к действительной и мнимой части
а также вычисление параметров числа в полярной системе координат:
|