A cosa serve la parola chiave "amico"?


11

Potete spiegarmi perché la friendparola chiave è preferita per dare diritti di accesso a dati privati ​​di classe?


1
Se chiedi perché è friendstato preferito, quali altri modi di solito usi per accedere ai dati della classe privata dall'esterno?
Benjamin Bannier,

@honk "Preferred" potrebbe essere la parola sbagliata da usare qui. Ho modificato la maggior parte dei post per correggere la grammatica e quant'altro e ho mantenuto la scelta della parola originale, ma penso che qui potrebbe esserci una barriera linguistica.
Adam Lear

Non lo so perché ho letto di amico oggi per caso. e l'articolo dice che se non uso un amico, creerò una classe monolit.
Dalton,

Risposte:


17

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.


Se potessi accedere pubblicamente ai dati (ad es. Tramite un getter) avresti invece utilizzato una funzione gratuita?
Ioanna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.