So I am making a rational number class. Ive got it most of the way done accept when I use the + operator the program crashes.

So I have a Rational class. All my operators are in the Rational class. My << and >> are friends of Rational class.

 ``12345678`` ``````// Here is my + overloaded operator Rational Rational::operator+(const Rational &rhs){ Rational temp; int cmd = denom * rhs.denom; temp.num = (num*rhs.denom)+(rhs.num+denom); temp.denom = cmd; return temp; }``````

When I declare Rational objects a, b , c and try say a=b+c the program stops working. Is this operator wrong or could it be a problem with the = operator?
I just don't know. Any help would be awesome. Thanks
I can post more of the code if needed.
operator+ looks correct. Can you show the definition of Rational?
Last edited on
Yes sir. Here it.
 ``12345678910111213141516171819202122232425262728293031323334`` ``````class Rational{ friend istream& operator >>(istream &is,Rational &obj); friend ostream& operator <<(ostream &os,const Rational &obj); public: Rational(); Rational(int newnum); Rational(int newnum, int newdenom); Rational(string); Rational(const Rational &); Rational &operator=(const Rational &); Rational &operator=(const int); Rational &operator=(const string); Rational operator+(const Rational &); Rational operator+(int); Rational operator+(string); Rational &operator+=(const Rational &); Rational &operator+=(int); Rational &operator+=(string); bool operator==(const Rational &); bool operator>(const Rational &); Rational operator++(); Rational operator++(int); operator double(); private: int num; int denom; string a; int *p; }; int ComputeGCD(int num, int denom); void Simplify(int &num, int &denom); void input();``````
Make sure you have implemented the copy constructor `Rational(const Rational &);` and the copy assignment operator `Rational &operator=(const Rational &);` correctly.

You should probably also have a destructor, but I don't think that is the cause of the problem.
http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29
Ok. So I think the assignment operator is working...
 ``12345`` ``````Rational& Rational::operator=(const Rational &rhs){ num = rhs.num; denom = rhs.denom; Simplify(num, denom); return *this;``````

I think it might be a problem with the copy constructor then.
 ``12345`` ``````Rational::Rational(const Rational &obj){ int *p; p = new int; *p = *obj.p; }``````

See any problems besides that memory leak?
Last edited on
Besides leaking memory, that constructor does nothing.
Edit: it may be dereferencing an invalid pointer too.

¿what are your `a' and `p' members for?

> try say a=b+c the program stops working.
debugger, backtrace

By the way, `Rational operator+(const Rational &) const;`
Last edited on
 ``1234567`` ``````Rational Rational::operator+(const Rational &rhs){ Rational temp; int cmd = denom * rhs.denom; temp.num = (num*rhs.denom)+(rhs.num+denom); temp.denom = cmd; return temp; }``````

Shouldn't line 4 read as follows:
`temp.num = (num*rhs.denom)+(rhs.num*denom);`
That is supposed to be a constructor to copy another object... implemented as
Rational a;
Rational e(a);

p is for the copy constructor.
a is just for the string conversions.

And thanks. Yeah that is supposed to a *.
Last edited on
Limit the scope of your variables.
I don't understand how are you planning to use `p', but it looks that `a' is just an auxiliar.

In the copy constructor that you posted, you are setting a local variable. Your member `p' remains uninitialized (as well as `num' and `denom')
 ``123`` ``````Rational a; Rational b(a); Rational c(b); //dereferencing an invalid pointer, possible crash ``````
Ok I read over the copy constructor material... Just not getting it.
Topic archived. No new replies allowed.