Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка основы класса 
:(
    Опции темы
DENAT
Дата 3.12.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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();
}

Если найдете ошибки и недочеты исправте пожалусто!!!!!!
Всем зарание спасибо!!!!!







PM MAIL   Вверх
zkv
Дата 3.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(DENAT @  3.12.2007,  16:32 Найти цитируемый пост)
Собственно надо исправить в выделенном коде,что бы было без temp(мне сказали что я сделал неправильно)

на самом деле объект принято в таких случаях по значению возвращать, тогда temp тут вполне к месту.
Код

Complx Complx::operator+( const Complx& z)
{
    Complx temp;
    temp.a=a+z.a;
    temp.b=b+z.b;
    return temp;
}


тегом код пользуйся  smile 

Это сообщение отредактировал(а) zkv - 3.12.2007, 16:38
PM MAIL   Вверх
DENAT
Дата 3.12.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



А что тогда мог иметь введу преподователь когда сказал что temp тут не к месту????

PM MAIL   Вверх
zkv
Дата 3.12.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(DENAT @  3.12.2007,  16:52 Найти цитируемый пост)
А что тогда мог иметь введу преподователь когда сказал что temp тут не к месту????

не знаю, что он имел ввиду, у тебя в этом коде 
Код

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;
}

а это очень частонаступаемые новичками грабли - передаем ссылку на локальную переменную. Те как только вышли из функции, она перестала существовать, и дальше ее использовать нельзя.

если же мы поступим так:
Код

Complx* Complx::operator+( Complx& z)
{
    Complx *temp = new Complx;
    temp->a=a+z.a;
    temp->b=b+z.b;
    return temp;
}

то это вполне законно. Но проблема появляется - когда освобождать память, и кто этим должен заниматься.

Лучше поступить так, как я показал в предыдущем посте.

Добавлено через 4 минуты и 25 секунд
Цитата(zkv @  3.12.2007,  17:03 Найти цитируемый пост)
Лучше поступить так, как я показал в предыдущем посте.

ну или более лаконично:
Код

Complx Complx::operator+( const Complx& z)
{
    return Complx( a+z.a, b+z.b );
}

ну и еще есть вариант через operator+=

Это сообщение отредактировал(а) zkv - 3.12.2007, 17:05
PM MAIL   Вверх
baldina
Дата 5.12.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Вобщем так. Имеем:

Код

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;

};


Сие уже неграмотно, т.к. мы можем писать

Код

Complx a(1,2);
Complx b = a + 1;


Но не можем

Код

Complx a(1,2);
Complx b = 1 + a;


потому что operator+ - член класса. Вообще такие операторы обычно делают свободными функциями и реализуют через оператор вида оп=

Код

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=0,double b=0);
    // Complx(const Complx&);  - не надо, компилятор сам создаст правильную версию
    Complx(double qwe);
    // Complx(); -- не надо, используем параметры по умолчанию
protected:
        double a,b;
};

Complx& Complx::operator+=(Complx& о)
{
   a += o.a;
   b += o.b;
   return *this;
}

Complx operator+(const Complx& x, const Complx& y)
{
  Complx temp = x;
  temp += y;
  return temp;
}
 


Замечу, что свободной функции 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+() как свободной функции (через +=) есть самый лучший вариант.


PM MAIL   Вверх
baldina
Дата 6.12.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



> Разработать конструктор копирования, переопределить операции присваивание, доп. присваивания, сравнение, ввод/вывод в стандартные потоки.

Ясно, что Вам просто предлагают потренироваться, иначе препод - дятел.

1. Конструктор копирования и оператор присваивания в этом классе не нужны. Компилятор их прекрасно создаст сам без Вашего участия.
Ну а для тренировки вы прекрасно справитесь сами - все очень похоже на уже готовый конструктор, а интерфейсы Вы написали правильно.
2. Арифметика. Вам показали, как это правильно делать: в классе пределяете += -= *= и т.д., а + - * и т.д. делаете свободными функциями.
3. Сравнение. Для комплексных чисел имхо имеет смысл только проверка равенства и неравенства. Примерно так:
Код

bool Complx::operator==(const Complx& other) const
{
   return a == other.a && b == other.b;
}

bool Complx::operator!=(const Complx& other) const
{
  return !(*this == other);
}

4. Можно для разнообразия добавить получение сопряженного числа, например перегрузив оператор ~

Код

Complx Complx::operator~() const
{
   return Complx(a,-b);
}


5. Что такое "доп. присваивание" я не понимаю.

6. Каким компилятором Вы пользуетесь? Что за страшные <conio.h>? Выбросьте эту отрыжку DOS  и используйте вместо getch()  cin.get()

7. Препод будет доволен, если Вы реализуете функции доступа к действительной и мнимой части
Код

double Complx::Re () const { return a; }
double Complx::Im () const { return b; }

а также вычисление параметров числа в полярной системе координат:

Код

double Complx::Dist () const { return sqrt(a*a + b*b); }
double Complx::Phi () const { return atan2(b,a); }



Это сообщение отредактировал(а) baldina - 6.12.2007, 00:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.