2010-07-13 10 views
5

¿Hay alguna manera de detectar (por ejemplo, con advertencia del compilador) si las clases están declaradas friend pero no tienen acceso a miembros privados, es decir. cuando la amistad es inútil?Clase de amigo sin usar en C++

+1

¿Tal vez puedas unir un programa usando las librerías Clang? –

Respuesta

3

Las advertencias del compilador no están estandarizadas, por lo que esto depende de su (s) compilador (es) específico (s). Sin embargo, me sorprendería mucho si alguno de ellos apoyara esto. Una situación similar sería si tuviera una función de miembro público que solo fue llamada por otros miembros públicos (lo que significa que no es necesario que sea pública), y una vez más, no creo que ningún compilador detecte esto.

Hacer cualquiera de estas pruebas significaría trabajo adicional para los escritores del compilador, y dudo que las consideren suficientemente útiles para implementar.

+1

No entendí su ejemplo de miembros públicos, pero estoy de acuerdo con su respuesta. –

+0

@Helltone: supongo que quiere decir que si se accede a una función de miembro público solo a través de otras funciones de la misma clase, no es necesario que sea pública en absoluto. – casablanca

2

No es que yo sepa. Tal vez haya una herramienta de refactorización que pueda hacerlo. Siempre puedes intentar eliminar la amistad y ver si aún se compila, pero eso puede consumir mucho tiempo para un proyecto grande.

6

No sé cómo detectar esto utilizando las advertencias del compilador sino otra forma de hacer esto sería ir a su archivo de definición de clase y hacer una búsqueda & substituye para friend class con /*friend*/ class y ver si todavía compila. Por supuesto, esto podría ser bastante tedioso para un gran proyecto.

+1

Eso causa un cambio bastante complejo en la semántica. Sería bastante difícil de explicar en un comentario aquí, pero básicamente la búsqueda de nombre difiere. – MSalters

+1

@MSalters: ¿Tiene un enlace donde pueda leer sobre él? Tengo curiosidad por saber cuál es el cambio en la semántica. – Praetorian

0

Puede compilar el código para ver que se compila, luego eliminar todas las declaraciones de 'amigos' (tal vez mediante programación con sed) y ver si todavía se compila.

+2

La siguiente macro es una manera fácil de convertir 'amigo' (y el resto de esa línea de código) en un comentario. Esto no funcionará si la declaración de amigo es multilínea. #define amigo // –

Cuestiones relacionadas