Las otras respuestas aquí va a resolver el problema, pero el siguiente es el patrón que utilizo cuando estoy haciendo esto:
class Num
{
public:
Num(int i) // Not explicit, allows implicit conversion to Num
: i_ (i)
{
}
Num (Num const & rhs)
: i_ (rhs.i_)
{
}
Num & operator+= (Num const & rhs) // Implement +=
{
i_ += rhs.i_;
return *this;
}
private:
int i_;
};
//
// Because of Num(int), any number on the LHS or RHS will implicitly
// convert to Num - so no need to have lots of overloads
Num operator+(Num const & lhs, Num const & rhs)
{
//
// Implement '+' using '+='
Num tmp (lhs);
tmp+=rhs;
return tmp;
}
Una de las principales ventajas de este enfoque es que sus funciones puede implementarse en términos de reducción de la cantidad total de código que necesita.
ACTUALIZACIÓN:
Para evitar que los problemas de rendimiento en la bahía, probablemente definir el operador de miembro + no como una función en línea algo como:
inline Num operator+(Num lhs, Num const & rhs)
{
lhs+=rhs;
return lhs;
}
Las operaciones miembros son también en línea (como lo se declara en el cuerpo de la clase) y, por lo tanto, en todo el código debería estar muy cerca del costo de agregar dos objetos int
crudos.
Finalmente, como señala jalf, se deben tener en cuenta las consecuencias de permitir conversiones implícitas en general. El ejemplo anterior asume que es sensato convertir de un tipo integral a un 'Num'.
+1. De todos modos, debería preferir las versiones que no sean miembros, incluso en los casos en que no sea necesario. Solo use las variantes de miembros cuando sea necesario. – jalf
Siempre prefiero hacer amistad con mis operadores no miembros. –