little_greg Posted November 10, 2009 Report Share Posted November 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);}; Link to comment Share on other sites More sharing options...
Тролль Posted November 10, 2009 Report Share Posted November 10, 2009 (edited) То есть ты хочешь заменить 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) и не забудь то же сделать в заголовочном файле. Тогда должно работать. Edited November 10, 2009 by Тролль Link to comment Share on other sites More sharing options...
Lion HC Posted November 10, 2009 Report Share Posted November 10, 2009 Странно, но у меня на VC2008 его пример работает... Link to comment Share on other sites More sharing options...
Тролль Posted November 10, 2009 Report Share Posted November 10, 2009 Lion HC: Чем черт не шутит, может, в VC2008 компилятор поумнел и видит, что обратно выражению значение присваивать не придется? У меня в Dev-C++ первоначальный вариант не проходит. Link to comment Share on other sites More sharing options...
little_greg Posted November 10, 2009 Author Report Share Posted November 10, 2009 тролль, сделал как ты сказал, появляется окно и сразу закрывается Link to comment Share on other sites More sharing options...
Тролль Posted November 10, 2009 Report Share Posted November 10, 2009 (edited) Хм, обоими способами так? :g: Я немного сомневался в способе с константным параметром, он тоже требует от компилятора некоторой сообразительности, но при отказе от ссылки должно работать и с самым глупым компилятором. А если исправить обратно на использование дополнительной переменной t, работает по-прежнему - может, что-то случайно еще задел при изменении текста? На Dev-C++ работает и с нормальным параметром - просто переменной, и с константной ссылкой. Edited November 10, 2009 by Тролль Link to comment Share on other sites More sharing options...
little_greg Posted November 10, 2009 Author Report Share Posted November 10, 2009 убрал ссылку, вернул t считает - не правильно, несколько раз перепроверил, ниче лишнего не удалил, не дописал Link to comment Share on other sites More sharing options...
Тролль Posted November 10, 2009 Report Share Posted November 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;} Тут я все для простоты объединил в один файл. Считает правильно. Тут выражение в оператор вывода введено только для суммы. Link to comment Share on other sites More sharing options...
little_greg Posted November 10, 2009 Author Report Share Posted November 10, 2009 а вот щас все нормально, очень спасибо Link to comment Share on other sites More sharing options...
Тролль Posted November 10, 2009 Report Share Posted November 10, 2009 (edited) Не зря первый персональный компьютер Джобс с Возняком продавали за 666 долларов 66 центов - "число Зверя". Сразу видно, от кого пошло программирование :g: P.S. Чтобы удостоверить цену ;) Edited November 10, 2009 by Тролль Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now