little_greg Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 не могу понять, почему если заменить в функции 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);}; Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 (изменено) То есть ты хочешь заменить 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) и не забудь то же сделать в заголовочном файле. Тогда должно работать. Изменено 10 ноября, 2009 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Lion HC Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 Странно, но у меня на VC2008 его пример работает... Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 Lion HC: Чем черт не шутит, может, в VC2008 компилятор поумнел и видит, что обратно выражению значение присваивать не придется? У меня в Dev-C++ первоначальный вариант не проходит. Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 10 ноября, 2009 Автор Жалоба Поделиться Опубликовано 10 ноября, 2009 тролль, сделал как ты сказал, появляется окно и сразу закрывается Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 (изменено) Хм, обоими способами так? :g: Я немного сомневался в способе с константным параметром, он тоже требует от компилятора некоторой сообразительности, но при отказе от ссылки должно работать и с самым глупым компилятором. А если исправить обратно на использование дополнительной переменной t, работает по-прежнему - может, что-то случайно еще задел при изменении текста? На Dev-C++ работает и с нормальным параметром - просто переменной, и с константной ссылкой. Изменено 10 ноября, 2009 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 10 ноября, 2009 Автор Жалоба Поделиться Опубликовано 10 ноября, 2009 убрал ссылку, вернул t считает - не правильно, несколько раз перепроверил, ниче лишнего не удалил, не дописал Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 Неправильно? Вот из окна моего компилятора: #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;} Тут я все для простоты объединил в один файл. Считает правильно. Тут выражение в оператор вывода введено только для суммы. Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 10 ноября, 2009 Автор Жалоба Поделиться Опубликовано 10 ноября, 2009 а вот щас все нормально, очень спасибо Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 ноября, 2009 Жалоба Поделиться Опубликовано 10 ноября, 2009 (изменено) Не зря первый персональный компьютер Джобс с Возняком продавали за 666 долларов 66 центов - "число Зверя". Сразу видно, от кого пошло программирование :g: P.S. Чтобы удостоверить цену ;) Изменено 10 ноября, 2009 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти