Dev C++

C

Crazy c

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?

Thanks!!

PS - This is the first time I've posted code, so please go easy on
pointing out mistakes
 
E

Erik Wikström

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.
 
E

Erik Wikström

Your function returns a reference to an object. Instead of returning a
reference to an object, your code tries to return an int value. The compiler
is telling you that this is not a valid type conversion.

If your ComplexNumber object has a constructor that takes an int parameter,
just change the function to return a ComplexNumber object, rather than a
reference to a ComplexNumber object.

A constructor have no return-type, so you can't change it.
 
E

Erik Wikström

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).

Actually, I'm assuming a bit to much here, as Sam pointed out, you are
trying to return an int when a reference to a ComplexNumber is expected
which does not work. Anyway, the solution is still the same.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top