¿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++
Respuesta
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.
No entendí su ejemplo de miembros públicos, pero estoy de acuerdo con su respuesta. –
@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
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.
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.
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
@MSalters: ¿Tiene un enlace donde pueda leer sobre él? Tengo curiosidad por saber cuál es el cambio en la semántica. – Praetorian
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.
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 // –
- 1. c + + clase con objetivo-c amigo
- 2. Cuándo utilizar la clase amigo en C++
- 3. ¿Usar una clase de amigo frente a agregar descriptores de acceso para pruebas unitarias en C++?
- 4. Funciones de amigo en C++
- 5. C# interno VS VBNET amigo
- 6. clase de amigo con acceso limitado
- 7. función de amigo en clase derivada con herencia privada
- 8. Clases de "amigo" en python
- 9. C++ plantilla amigo operador sobrecarga
- 10. C# clase sin constructor
- 11. Función de amigo de plantilla de una clase de plantilla
- 12. Interacción de espacio de nombres y amigo en C++?
- 13. declaración de amigo declara una función sin plantilla
- 14. ¿Cuál es el equivalente de C# de un amigo?
- 15. amigo función de acceso definido en la clase
- 16. ¿Puedo usar métodos de una clase sin instanciar esta clase?
- 17. ¿El "amigo" de una clase se extiende a las clases declaradas dentro de esa clase?
- 18. función de amigo en php?
- 19. C++: Función amigo en una clase de plantilla para el operador <<
- 20. ¿Cómo declarar un amigo que es miembro de otra clase aún no definida en C++?
- 21. En C++, no añadir un amigo a una clase cambia su esquema de memoria?
- 22. Modelando relaciones de amigo de amigo en MongoDB
- 23. Usar la clase NSManagedObject sin initWithEntity :?
- 24. ¿Especifica una función de miembro de clase como amigo de otra clase?
- 25. amigo clase función dentro de un espacio de nombres
- 26. operador amigo << La sobrecarga de clase de plantilla
- 27. Usar DLL en C sin lib
- 28. amigo con clase pero no puede acceder a miembros privados
- 29. Plantilla de clase con amigo de clase de plantilla, ¿qué está pasando realmente aquí?
- 30. ¿Cuál es la diferencia entre el iterador de amigo y el iterador de clase de amigo que encuentro en pensar en C++?
¿Tal vez puedas unir un programa usando las librerías Clang? –