A cosa serve la parola chiave "amico"?

11

Puoi spiegarmi perché la parola chiave friend è preferibile per fornire i diritti di accesso ai dati privati della classe?

    
posta Dalton 09.08.2011 - 06:16
fonte

1 risposta

17

Amico è il modo classico di estendere l'interfaccia di una classe.
Ma la cosa bella è che l'amico documenta esplicitamente la tua intenzione di associare strettamente elementi specifici a una classe.

Nota: usando un amico, leghi strettamente gli amici alla classe.

Un esempio perfetto sono gli operatori di streaming 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 all'interno e all'esterno di un flusso, ma senza esporre l'implementazione interna o causare problemi futuri all'implementazione richiedendo l'uso di get / set metodi che devono essere mantenuti (perché sarebbero parte dell'interfaccia pubblica) anche se l'implementazione interna è stata modificata.

Nota: questo NOT interrompe l'incapsulamento ma associa strettamente gli operatori di streaming all'implementazione della classe Plop (cioè qualsiasi modifica all'implementazione della classe Plop richiederà una modifica all'implementazione degli operatori del flusso). Ma questo è previsto. Tutte le parti dell'interfaccia pubblica (compresi i metodi pubblici / protetti) sono strettamente legate all'implementazione.

Ma Nota: hai esplicitamente documentato questa associazione come parte della dichiarazione della classe.

Nota: non mi riferirei ad un 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.

    
risposta data 09.08.2011 - 07:03
fonte

Leggi altre domande sui tag