Potete spiegarmi perché la friend
parola chiave è preferita per dare diritti di accesso a dati privati di classe?
Potete spiegarmi perché la friend
parola chiave è preferita per dare diritti di accesso a dati privati di classe?
Risposte:
Amico è il modo classico di estendere l'interfaccia di una classe.
Ma la cosa fantastica è che l'amico documenta esplicitamente la tua intenzione di vincolare strettamente elementi specifici a una classe.
Nota: usando amico stai legando strettamente gli amici alla classe.
Un esempio perfetto sono gli operatori di flusso in C ++
class Plop
{
private:
int value;
friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
friend std::istream& operator>>(std::istream& stream, Plop& data);
};
std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop& data)
{
return stream >> data.value;
}
Qui stiamo estendendo l'interfaccia pubblica della classe Plop in un modo che ci consente di eseguire lo streaming dell'oggetto in entrata e in uscita da un flusso, ma senza esporre l'implementazione interna o causare futuri mal di testa richiedendo l'uso di metodi get / set che devono essere mantenuto (perché farebbero parte dell'interfaccia pubblica) anche se l'implementazione interna è cambiata.
Nota: questo NON interrompe l'incapsulamento ma vincola strettamente gli operatori di flusso all'implementazione della classe Plop (ovvero qualsiasi modifica all'implementazione della classe Plop richiederà una modifica all'implementazione degli operatori di flusso). Ma questo è previsto. Tutte le parti dell'interfaccia pubblica (compresi i metodi pubblici / protetti) sono strettamente legate all'implementazione.
Nota: hai esplicitamente documentato questo legame come parte della dichiarazione di classe.
Nota: non vorrei riferire ad amico come il modo preferito per esporre i dati privati. L'uso eccessivo di un amico può essere altrettanto grave che esporre l'implementazione. Come tutte le funzionalità linguistiche, dovrebbe essere usato con giudizio.
friend
stato preferito, quali altri modi di solito usi per accedere ai dati della classe privata dall'esterno?