Re: Dev C++
On 2008-04-20 18:50, Crazy c wrote:
I have hit an error that I do not understand. That is one thing about
Dev that I do not like, I cannot understand the errors. There should
be a course in Dev errors. It is pretty straightforward; I am checking
that the real and imginary parts of a Complex Number are not equal to
0 (division). In (a,b)/(c,d), if c && d = 0; I want to display an
error message and return to the program.
ComplexNumber &ComplexNumber :: operator/ (const ComplexNumber & c1)
{
//check for c & d = 0
if (c1.getReal()== 0 && c1.getImag()== 0) {
cout << "The Complex Number used for your
denominator cannot contain 0 for the real AND
the imaginary part" << endl;
return 1;// this generates the error
}
ComplexNumber complxSum;
double s;
//for s
s = ((this -> getImag() * this -> getImag()) +
(c1.getImag() * c1.getImag()));
//divide
complxSum.setReal ( ((c1.getReal() * this -> getReal())
+ (c1.getImag() * this -> getImag())) /s);
complxSum.setImag ( ((c1.getReal() * this -> getImag())
- (c1.getImag() * this -> getReal())) /s);
return complxSum;
}//end operator/
//error from Dev
102 C:\Documents and Settings\cbrown\My Documents\DSCmplxNum
\ComplexNumber.cpp invalid initialization of non-const reference of
type 'ComplexNumber&' from a temporary of type 'int'
Any ideas as to why the return does not work or what the error
designates?
As the error message states the / operator returns a reference to a
ComplexNumber object. However you return 1, which will be used to
construct a ComplexNumber object (with the value 1+0i, I would assume).
This object will be a temporary, and you can not bind a reference to a
temporary (you can bind const references to temporaries though).
In your case you do not want to return a reference to a ComplexNumber,
you want to return a copy, because when operator/ returns the object you
created to store the result in will be destructed, and any references to
it will be invalid (trying to use such a reference will result in UB
(undefined behaviour), which will likely crash your program).
Also, returning a value that indicates that the operation went wrong is
a bad idea, how will you tell the difference between an operation where
the result is 1+0i and an operation that went wrong? What you want to do
in this situation is to throw an exception, that is what they are for.
PS - This is the first time I've posted code, so please go easy on
pointing out mistakes
You are doing just fine, but in the future you might want to consider
changing the code so that a tab is represented by somewhere 2 and 4
spaces, it reduces the risk of line-wrapping.
--
Erik Wikstr??m