Not being able to overload ++ operator
I am not being able to overload ++ operator.
I have written the following code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#include<iostream>
#include<conio.h>
using namespace std;
class A
{
public:
int nr;
int dr;
double val;
A(int numerator = 0, int denominator = 1)
{
nr = numerator;
dr = denominator;
val =(double)nr/dr;
cout<<"IN A CONSTRUCTOR"<<endl;
}
A operator++()
{
cout<<"1"<<endl;
nr++;
dr++;
return(A(nr,dr));
}
virtual ~A()
{
cout<<"IN A DESTRUCTOR"<<endl;
}
};
ostream& operator<<(ostream& s,A* x)
{
s<<x->nr<<"/"<<x->dr<<endl;
}
int main()
{
A* obj = new A(3,2);
cout<<obj<<endl;;
++obj;
cout<<obj<<endl;
delete obj;
getch();
return 0;
}
| |
Please help me in finding the mistake in the above code.
try using *this
You should be returning *this in the operator, but that isn't the problem. You are complicating things by using a pointer. See my edit to your code
1 2 3 4 5 6 7 8 9 10 11 12
|
int main()
{
A* obj = new A(3,2);
cout<<obj<<endl;;
++(*obj);//<--- HERE!
cout<<obj<<endl;
delete obj;
getch();
return 0;
}
| |
Last edited on
Better solution: don't use pointers/new unless you have to:
1 2 3 4 5 6 7 8 9 10
|
int main()
{
A obj(3,2);
cout << obj.nr << endl;
++obj;
cout << obj.nr << endl;
return 0;
}
| |
This expression
++obj;
has nothing common with your overload operator. Here a pointer is increased. In fact this expression
++obj;
is equivalent to
obj = obj + sizeof( A );
that is there is the usual pointer arithmetic.
As @DTSCode above pointed out you need to return the instance of your class back from the operator function i.e. *this:
1 2 3 4 5 6
|
A& operator++()
{
++nr;
++dr;
return *this;
}
| |
HTH
Andrew
vlad from moscow wrote: |
---|
++obj;
is equivalent to
obj = obj + sizeof( A ); |
Not really. It is more equivalent to
obj = reinterpret_cast<A*>(reinterpret_cast<char*>(obj) + sizeof(A));
You are right. It is my typo.:)
Topic archived. No new replies allowed.