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;
}
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top