2010-07-13 13 views
5

C'è un modo per rilevare (ad esempio con avviso del compilatore) se le classi sono dichiarate friend ma non accedere ai membri privati, es. quando l'amicizia è inutile?Classe di amici non utilizzati in C++

+1

Forse puoi unire un programma usando le librerie Clang? –

risposta

3

Gli avvisi del compilatore non sono standardizzati, quindi questo dipende dal/i compilatore/i specifico/i. Sarei molto sorpreso se qualcuno di loro supportasse questo, comunque. Una situazione simile potrebbe essere se tu avessi una funzione membro pubblica che è stata chiamata solo da altri membri pubblici (il che significa che non deve essere pubblica), e ancora una volta non penso che nessun compilatore lo rilevi.

Fare uno di questi test significherebbe un lavoro supplementare per gli autori del compilatore e dubito che li vedrebbero come sufficientemente utili da implementare.

+1

Non ho capito bene il tuo esempio di membri pubblici, ma altrimenti sono d'accordo con la tua risposta. –

+0

@Helltone: Suppongo che intenda che se si accede a una funzione membro pubblica solo attraverso altre funzioni della stessa classe, non è necessario che sia pubblica. – casablanca

2

Non che io sappia. Forse c'è uno strumento di refactoring là fuori che può farlo. Puoi sempre provare a rimuovere l'amicizia e vedere se è ancora compilato, ma potrebbe richiedere molto tempo per un grande progetto.

6

Non so come rilevare questo utilizzando avvisi del compilatore, ma un altro modo di fare questo sarebbe quella di andare al file di definizione della classe e fare una ricerca & sostituzione per friend class con /*friend*/ class e vedere se si compila ancora. Naturalmente, questo potrebbe diventare piuttosto noioso per un grande progetto.

+1

Ciò causa un cambiamento piuttosto complesso nella semantica. Sarebbe piuttosto difficile da spiegare in un commento qui, ma fondamentalmente la ricerca dei nomi è diversa. – MSalters

+1

@MSalters: hai un link dove posso leggere a riguardo? Sono curioso di sapere qual è il cambiamento nella semantica. – Praetorian

0

È possibile compilare il codice per verificare che venga compilato, quindi rimuovere tutte le dichiarazioni "amico" (magari programmaticamente con sed) e vedere se è ancora compilato.

+2

La seguente macro è un modo semplice per trasformare "amico" (e il resto di quella riga di codice) in un commento. Questo non funzionerà se la dichiarazione amico è multilinea. #define amico // –

Problemi correlati