forma canonica di + = operatore per le classi
-
22-08-2019 - |
Domanda
Lo so che è una buona idea per rendere quanto più l'interfaccia di una classe non membro non-amico più possibile, e ho appena capito che per il mio 3D classe Vector, 'Vector3', posso spostare il + =, -. = e così via gli operatori fuori della classe, lasciando solo costruttori e l'operatore di assegnamento per copia
La domanda è: che cosa dovrebbe questo sguardo operatore come? Ho visto le forme canoniche di un sacco di altri operatori e ho seguito i loro consigli, ma non ho visto forme canoniche di questi operatori. Ho dato quello che penso dovrebbe essere inferiore.
La questione secondaria è: quali sono questi operatori anche chiamato? operatori di assegnazione aritmetica?
Il codice (rilevante) prima:
class Vector3 {
public:
Vector3& operator+=(const Vector3& rhs);
float x, y, z;
};
Vector3& Vector3::operator+=(const Vector3 &rhs) {
x += rhs.x;
y += rhs.y;
z += rhs.z;
return *this;
}
Quello che ho cambiato in così lontano:
class Vector3 {
public:
float x, y, z;
};
Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
lhs.x += rhs.x;
lhs.y += rhs.y;
lhs.z += rhs.z;
return lhs;
}
Soluzione
Quello che devi sembra buono per me.
A proposito, quando si arriva a l'operatore +, è comune per attuare tale in termini di + =. (Creare una copia di ss, e quindi chiamare sx + = sd e restituire il risultato)
Non so se siete già a conoscenza di questo trucco, ma dal momento che siete preoccupati per modi canonici per implementare questi operatori, che non può far male a parlarne. :)
Altri suggerimenti
Quello che devi sembra buono.
Il modo più semplice per pensare a questo, intuitivamente, è quello di pensare a ciò che si desidera il codice a guardare come quando si scrive. Se, in questo caso, è possibile scrivere
Vector v, w;
v += w;
w += v;
e così via, siete sulla strada giusta.
Ci sono un sacco di buone regole di pollice per aiutare; vedi questa voce in C ++ Domande frequenti per un sacco su di esso.
Non vorrei dire "tanto dell'interfaccia possibile". Non c'è molto da guadagnare facendo operator+=
, operator-=
ecc un non-amico Non-membro.
Alcune persone preferiscono fare ogni funzione possibile funzione un non-membro non-amico di resistere alla tentazione di usare variabili membro private. Ma sei un adulto: è possibile scrivere la funzione come un membro pubblico, e non utilizzare le variabili membro private. Preferisco sapere che la funzione è legata alla classe, e che lo rende un membro pubblico rende esplicito.
Nota a parte:
Personalmente, trovo che spesso è OK per utilizzare i membri privati, invece di funzioni di accesso pubblici (lo so - mi brucerò all'inferno). Non sempre! - ma spesso
.
In realtà, ci sono alcuni casi in cui non si poteva fare l'interruttore di accesso pubblico in un modo di minuti se si decide avete bisogno. Ma riconosco che non è una visione popolare e io non chiedo alle persone di seguire questa filosofia.
Ci sono ragioni concrete per rendere certaint Funzioni e operatori "non-amico, non membri". Per esempio, l'operatore << () quando viene utilizzato come "operatore di stream-inserimento" non possono essere realizzato un membro perché si dovrebbe cambiare la classe LHS (il flusso).