Перейти к содержанию
СофтФорум - всё о компьютерах и не только

перегрузка операции с++


Рекомендуемые сообщения

не могу понять, почему если заменить в функции main() переменную "t" в выводе, которой присвоено значение одного из выражений(a + c, a * c...), то программа работает, а если использовать сами выражения в выводе, то получается ошибка. помогите разобраться.

main()

#include <iostream>#include "complex0.h"int main(){using std::cout;using std::endl;using std::cin;Complex a(3.0, 4.0);cout << a << endl;Complex c;while (cin >> c){	  Complex t;	  t = a + c;	  cout << "(a + c) = " << t << endl;	  t = a - c;	  cout << "(a - c) = " << t << endl;	  t = a * c;	  cout << "(a * c) = " << t << endl;	  t = 2 * c;	  cout << "(2 * c) = " << t << endl;}system("PAUSE");return 0;}

complex0.cpp

#include <iostream>#include "complex0.h"Complex::Complex(double r, double i){					re = r;					im = i;}Complex Complex::operator+(Complex& c){	Complex temp;	temp.re = re + c.re;	temp.im = im + c.im;	return temp;}Complex Complex::operator-(Complex& c){	Complex temp;	temp.re = re - c.re;	temp.im = im - c.im;	return temp;}Complex Complex::operator*(Complex& c){	Complex temp;	double n1, n2;	n1 = re * c.re - im * c.im;	n2 = re * c.im + im * c.re;	temp.re = n1;	temp.im = n2;	return temp;}Complex operator*(double mult, Complex& c){	Complex temp;	temp.re = c.re * mult;	temp.im = c.im * mult;	return temp;}std::ostream& operator<<(std::ostream& os, Complex& c){		  os << "(" << c.re << ", " << c.im <<")";		  return os;}std::istream& operator>>(std::istream& is, Complex& c){		  is >> c.re >> c.im;		  return is;}

complex0.h

class Complex{  private:		  double re;		  double im;  public:		 Complex(double r = 0, double i = 0);		 Complex operator+(Complex& c);		 Complex operator-(Complex& c);		 Complex operator*(Complex& c);		 friend Complex operator*(double mult, Complex& c);		 friend std::ostream& operator<<(std::ostream& os, Complex& c);		 friend std::istream& operator>>(std::istream& is, Complex& c);};
Ссылка на комментарий
Поделиться на другие сайты

То есть ты хочешь заменить

t=a+c; cout<<"(a+c)="<<t<<endl;

на

t=a+c; cout<<"(a+c)="<<a+c<<endl;

а оно не работает?

Так в перегруженной операции ты используешь ссылку. Что такое ссылка? Автоматически создаваемый и разыменовываемый указатель. А как создать работающий и на присаивание указатель на выражение a+b ? Вдруг значение этого параметра в функции изменится, как тогда присвоить новое значение выражению? То же самое, как в операторе ввода указать присваивать вводимое значение не переменной, а выражению. Такое даже C++ не пропустит. Вот присвоить что-то переменной t, если функция этого захочет - совсем другое дело. Поэтому с переменной всё проходит проверку компилятора, а с выражением - нет.

Если хочешь, чтобы можно было подставлять выражения, или сделай параметр константным, чтобы ясно было, что не придется присваивать выражению что-то выработанное функцией, или не делай типом параметра функции ссылку. Возвращаясь к нашим конкретным баранам, замени

std::ostream& operator<<(std::ostream& os, Complex& c)

на

std::ostream& operator<<(std::ostream& os, const Complex& c)

или на

std::ostream& operator<<(std::ostream& os, Complex c)

и не забудь то же сделать в заголовочном файле. Тогда должно работать.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Lion HC:

Чем черт не шутит, может, в VC2008 компилятор поумнел и видит, что обратно выражению значение присваивать не придется?

У меня в Dev-C++ первоначальный вариант не проходит.

Ссылка на комментарий
Поделиться на другие сайты

Хм, обоими способами так? :g: Я немного сомневался в способе с константным параметром, он тоже требует от компилятора некоторой сообразительности, но при отказе от ссылки должно работать и с самым глупым компилятором. А если исправить обратно на использование дополнительной переменной t, работает по-прежнему - может, что-то случайно еще задел при изменении текста? На Dev-C++ работает и с нормальным параметром - просто переменной, и с константной ссылкой.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

убрал ссылку, вернул t считает - не правильно, несколько раз перепроверил, ниче лишнего не удалил, не дописал

Ссылка на комментарий
Поделиться на другие сайты

Неправильно?

Вот из окна моего компилятора:

#include <iostream>class Complex{  private: double re, im;  public:		 Complex(double r = 0, double i = 0);		 Complex operator+(Complex& c);		 Complex operator-(Complex& c);		 Complex operator*(Complex& c);		 friend Complex operator*(double mult, Complex& c);		 friend std::ostream& operator<<(std::ostream& os, const Complex& c);		 friend std::istream& operator>>(std::istream& is, Complex& c);};int main(){using std::cout;using std::endl;using std::cin;Complex a(3.0, 4.0);cout << a << endl;Complex c;while (cin >> c){ Complex t;	  cout<<"(a + c) = "<<a+c<<endl;	  cout<<"(a - c) = "<<(t=a-c)<<endl;	  cout<<"(a * c) = "<<(t=a*c)<<endl;	  cout<<"(2 * c) = "<<(t=2*c)<<endl;}return 0;}Complex::Complex(double r, double i){ re = r; im = i;}Complex Complex::operator+(Complex& c){ Complex temp; temp.re=re+c.re; temp.im=im+c.im; return temp;}Complex Complex::operator-(Complex& c){ Complex temp; temp.re=re-c.re; temp.im=im-c.im; return temp;}Complex Complex::operator*(Complex& c){ Complex temp; double n1, n2;  n1=re*c.re-im*c.im; n2=re*c.im+im*c.re; temp.re=n1; temp.im=n2; return temp;}Complex operator*(double mult, Complex& c){ Complex temp; temp.re=c.re*mult; temp.im=c.im*mult; return temp;}std::ostream& operator<<(std::ostream& os, const Complex& c){ os<<"("<<c.re<<", "<<c.im<<")"; return os;}std::istream& operator>>(std::istream& is, Complex& c){ is>>c.re>>c.im; return is;}

Тут я все для простоты объединил в один файл. Считает правильно.

Тут выражение в оператор вывода введено только для суммы.

Ссылка на комментарий
Поделиться на другие сайты

Не зря первый персональный компьютер Джобс с Возняком продавали за 666 долларов 66 центов - "число Зверя". Сразу видно, от кого пошло программирование :g:

P.S. Чтобы удостоверить цену ;)

14b.png

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...