Le altre risposte qui risolveranno il problema, ma il seguente è il modello che uso quando sto facendo questo:
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;
}
Uno dei principali vantaggi di questo approccio è che le funzioni può essere implementato in termini l'uno dall'altro riducendo la quantità di codice generale di cui hai bisogno.
UPDATE:
Per mantenere problemi di prestazioni a bada, probabilmente definire il non all'operatore membro + come una funzione inline qualcosa di simile:
inline Num operator+(Num lhs, Num const & rhs)
{
lhs+=rhs;
return lhs;
}
Le operazioni membri sono anche in linea (come viene dichiarato nell'organismo della classe) e quindi in tutto il codice dovrebbe essere molto vicino al costo dell'aggiunta di due oggetti grezzi int
.
Infine, come sottolineato da jalf, le conseguenze di consentire conversioni implicite in generale devono essere considerate. L'esempio precedente presuppone che sia ragionevole convertire da un tipo integrale a un 'Num'.
fonte
2009-07-27 15:03:25
+1. Dovresti preferire comunque le versioni non associate, anche nei casi in cui non è necessario. Utilizza le varianti dei membri solo quando necessario. – jalf
Preferisco sempre fare amicizia con i miei operatori non membri. –