![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| DENAT |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Мне надо немного переделать код проги
#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(); } Если найдете ошибки и недочеты исправте пожалусто!!!!!! Всем зарание спасибо!!!!! |
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
на самом деле объект принято в таких случаях по значению возвращать, тогда temp тут вполне к месту.
тегом код пользуйся Это сообщение отредактировал(а) zkv - 3.12.2007, 16:38 |
||||
|
|||||
| DENAT |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
А что тогда мог иметь введу преподователь когда сказал что temp тут не к месту????
|
|||
|
||||
| zkv |
|
||||||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
не знаю, что он имел ввиду, у тебя в этом коде
Возможно препод не заметил этого и воспринял твой код как:
а это очень частонаступаемые новичками грабли - передаем ссылку на локальную переменную. Те как только вышли из функции, она перестала существовать, и дальше ее использовать нельзя. если же мы поступим так:
то это вполне законно. Но проблема появляется - когда освобождать память, и кто этим должен заниматься. Лучше поступить так, как я показал в предыдущем посте. Добавлено через 4 минуты и 25 секунд ну или более лаконично:
ну и еще есть вариант через operator+= Это сообщение отредактировал(а) zkv - 3.12.2007, 17:05 |
||||||||||
|
|||||||||||
| baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Вобщем так. Имеем:
Сие уже неграмотно, т.к. мы можем писать
Но не можем
потому что 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 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
> Разработать конструктор копирования, переопределить операции присваивание, доп. присваивания, сравнение, ввод/вывод в стандартные потоки.
Ясно, что Вам просто предлагают потренироваться, иначе препод - дятел. 1. Конструктор копирования и оператор присваивания в этом классе не нужны. Компилятор их прекрасно создаст сам без Вашего участия. Ну а для тренировки вы прекрасно справитесь сами - все очень похоже на уже готовый конструктор, а интерфейсы Вы написали правильно. 2. Арифметика. Вам показали, как это правильно делать: в классе пределяете += -= *= и т.д., а + - * и т.д. делаете свободными функциями. 3. Сравнение. Для комплексных чисел имхо имеет смысл только проверка равенства и неравенства. Примерно так:
4. Можно для разнообразия добавить получение сопряженного числа, например перегрузив оператор ~
5. Что такое "доп. присваивание" я не понимаю. 6. Каким компилятором Вы пользуетесь? Что за страшные <conio.h>? Выбросьте эту отрыжку DOS и используйте вместо getch() cin.get() 7. Препод будет доволен, если Вы реализуете функции доступа к действительной и мнимой части
а также вычисление параметров числа в полярной системе координат:
Это сообщение отредактировал(а) baldina - 6.12.2007, 00:08 |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |