2012-11-24 2 views
8

Sono nuovo per gli operatori di overloading, ho fatto qualche ricerca e ho trovato this helpful article, ho scritto il mio codice come ha fatto l'autore ma ottengo l'errore vector vector::operator*(float, vector) must take either zero or one argument.Over loading * operator - deve prendere o uno o uno argomenti

Ecco il mio codice:

class vector 
{ 
     public: 
     float x; 
     float y; 

     vector(float, float); 
     float operator$ (vector, vector); 
     vector operator* (float, vector); 
     vector operator* (vector, float); 
}; 

vector::vector(float _x = 0, float _y = 0) 
{ 
    x = _x; 
    y = _y;  
} 
const float vector::operator$ (const vector &v1, const vector &v2) 
{ 
    return (v1.x * v2.x) + (v1.y * v2.y); 
} 

const vector vector::operator* (const float &m, const vector &v) 
{ 
    vector ret_val = v; 
    ret_val.x *= m; 
    ret_val.y *= m; 
    return ret_val; 
} 

const vector vector::operator* (const vector &v, const float &m) 
{ 
     return m * vector;  
} 

Il mio sistema operativo è kubuntu 12.04 e il mio IDE è dev-C++ in esecuzione su Linux utilizzando finestre vino programma di caricamento.

+3

La prima volta che ho mai visto qualcuno sovraccarico '' $ ..... – 0x499602D2

+0

ho cercato di trovare un buon operatore per la rappresentazione prodotto scalare in vettori, nulla di buono è venuto nella mia mente; possiamo definire un nuovo operatore come quello che ho fatto? –

risposta

15

Poiché si sta definendo operator*() come funzione membro, esiste già un parametro implicito: l'oggetto per il quale il metodo è stato richiamato! Pertanto, le funzioni membro richiedono un parametro esplicito, non due.

+0

possiamo accedere al parametro implicito di 'this. ... ', ho ragione? –

+0

@EBi Questo è corretto in quanto è possibile, ma davvero non è necessario. 'this-> x' è equivalente a solo' x' all'interno di una funzione membro. Il compilatore convertirà 'x' in' this-> x'. – chrisaycock

7

Basta dichiarare la funzione di sovraccarico dell'operatore al di fuori della classe. Inoltre stai restituendo un const che potrebbe non essere quello che vuoi.

class foo { 
    //code 
}; 

foo operator*(foo& lhs, bar& rhs) const; 
foo operator*(bar& lhs, foo& rhs) const; 
+0

perché dichiarare la funzione di sovraccarico dell'operatore al di fuori della classe? – user2131316

+2

Questo link spiega il motivo. Spero che sia d'aiuto. http://stackoverflow.com/questions/4652932/why-define-operator-or-outside-a-class-and-how-to-do-it-properly – ajp013