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

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


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

не могу понять, почему если заменить в функции 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

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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