Reputation: 183
I want to add 2 objects, by overloading the + operator, but my compiler says there's no matching function to call to point::point(int, int). Can somebody please help me with this code, and explain the error ? thank you
#include <iostream>
using namespace std;
class point{
int x,y;
public:
point operator+ (point & first, point & second)
{
return point (first.x + second.x,first.y + second.y);
}
};
int main()
{
point lf (1,3)
point ls (4,5)
point el = lf + ls;
return 0;
}
Upvotes: 11
Views: 23383
Reputation: 275800
class point{
int x,y;
public:
point& operator+=(point const& rhs)& {
x+=rhs.x;
y+=rhs.y;
return *this;
}
friend point operator+(point lhs, point const& rhs){
lhs+=rhs;
return lhs;
}
};
There are a pile of little tricks above that make following this pattern a good "no brainer".
+=
and +
with the "proper" semantics.+
s together, you get elision of the left hand side operation. (ie, a+b+c
becomes (a+b)+c
, the return value of a+b
is elided into the _+c
call). If your objects have movable state, the proper moves happen for no design cost.a+b
works if either a
or b
is a point
, and the other has an implicit-conversion-to-point
. Member operator+
does not do this if a
is not a point; this is pointless asymmetry.a+=b
is often more efficient to implement than a=a+b
. When you implement +=
here, you get an efficient +
as well. And your +=
is in turn defined in terms of member variable +=
s.Upvotes: 5
Reputation: 177
You can just change your code like this,
#include <iostream>
using namespace std;
class point {
int x, y;
public:
point(int i, int j)
{
x = i;
y = j;
}
point operator+ (const point & first) const
{
return point(x + first.x, y + first.y);
}
};
int main()
{
point lf(1, 3);
point ls(4, 5);
point el = lf + ls;
return 0;
}
Hope this helps...
Upvotes: 14
Reputation: 6993
The error with gdb I get is
main.cpp:8:49: error: ‘point point::operator+(point&, point&)’ must take either zero or one argument
This is because the the object that you plan to perform the operation on is this
(the left hand side) and then the right hand side is the argument. If you wish to use the format that you've taken, then you can put the declaration outside the class - ie
struct point
{
// note made into a struct to ensure that the below operator can access the variables.
// alternatively one could make the function a friend if that's your preference
int x,y;
};
point operator+ (const point & first, const point & second) {
// note these {} are c++11 onwards. if you don't use c++11 then
// feel free to provide your own constructor.
return point {first.x + second.x,first.y + second.y};
}
Upvotes: 3