2011-06-18 16 views
7

Al trabajar con C++ nativo en Visual Studio, intellisense muestra los miembros y las funciones privadas incluso cuando están fuera del alcance de la clase contenedora. Esto hace que sea difícil crear API limpias para las clases que escribo.¿Por qué el intellisense de Visual Studio muestra miembros y funciones privados?

¿Hay alguna razón para esto? ¿Se puede prevenir esto?

+0

@Keoki Voy a intentar un poco más difícil :) – aligray

+0

¿Está tratando de evitar que esto suceda cuando los clientes usan su código? Dudo que eso sea posible. Si se trata de una configuración en MSVC, todo el que use su API debería tenerlo activado. – RageD

+1

@Keoki: existe con algunas soluciones de terceros de Intellisense como Visual Assist X, pero no está integrado en Visual Studio. – ildjarn

Respuesta

2

Bueno, ¿por qué no debería mostrar los privados también? Son miembros, después de todo, existen y son perfectamente accesibles desde ciertos contextos, al igual que cualquier otro miembro.

Sería muy difícil para IntelliSense determinar si los miembros son accesibles o no desde este contexto específico, especialmente si se tiene en cuenta que en la mayoría de los casos este contexto aún no está completo (el usuario aún lo está escribiendo)), lo que significa que generalmente es imposible analizarlo.

+0

Creo que aprenderé a vivir con eso. – aligray

+4

Intellisense es tan productivo porque se reduce al alcance más específico posible. Si cada vez que comenzases a escribir mostrara cada clase en cada espacio de nombre en cada ensamblaje, no sería tan efectivo. En cambio, su trabajo es reducir el alcance tanto como sea posible. Solo mostrará tipos en los ensamblados actualmente cargados y en los espacios de nombres actualmente importados.Al seleccionar miembros, solo debe mostrar los miembros que están en el alcance, aquellos de acceso público. – Despertar

+1

-1 Visual Studio usa el front end del compilador EDG para su compatibilidad con IntelliSense. No hay nada difícil en determinar el nivel de acceso de cualquier símbolo dado en un contexto dado. EDG proporciona un AST completo. – IInspectable

3

El motivo probablemente solo lo sepa Microsoft. (Creo que Intellisense no verifica dónde se encuentra en este momento, por lo que no sabe si usted está dentro de la clase (y puede acceder a miembros privados) o afuera)

En realidad, no sé si cómo se puede prevenir
Pero hasta donde sé, tienen un icono con una cerradura para que sepas que son privados. Tal vez eso ayude

+1

Por supuesto que se podría prevenir. Intellisense en C++ no es tan bueno como lo es para los proyectos .NET. Dado, estoy seguro de que es más difícil de implementar para C++. –

+1

@Ed S .: ¿Lo ha usado en VC 2010? Está casi a la par con .NET en este punto. –

+0

@Billy: De hecho, ese es un buen punto y es divertido, lo dejé. Usé VC10 la última noche por primera vez y la compilación de fondo e intellisense fueron muy agradables. Este fue un proyecto C, no C++, pero aún así, muy bueno. –

0

Desafortunadamente, esto solo funciona para cualquier cosa que usted haga, pero es algo que debe tener en cuenta si utiliza muchas de sus propias bibliotecas.

Una cosa que hice para cualquier biblioteca que hago es intentar engañar a intellisense con un #define. En mi declaración de la clase en el archivo de cabecera para cualquier biblioteca que estoy haciendo, me rodeo toda la parte privada en un espacio #ifdef, por ejemplo

#ifdef MYCLASS_SHOW_PRIVATE_VARIABLES 
private: 
    int hideThisVariable; 
    float noShow; 
    void HiddenIncrementFunction(); 
#endif 

Luego, en la sección de código de la clase donde necesito proporcionar definiciones para todos los métodos, en la parte superior antes de incluir el archivo con las declaraciones de clase, agrego

#define MYCLASS_SHOW_PRIVATE_VARIABLES 

de esta manera, los miembros privados son accesibles solamente a los métodos que se implemente para su clase en el archivo de origen. Cualquier cliente que use esta biblioteca no podrá ver las variables privadas a través de intellisense, a menos que, por supuesto, definan su directiva preprocesador.

+2

¿Dude no cambiaría el tamaño de tus clases en función de si esa definición está allí o no? Si alguien apila asigna tus clases, serás atormentado. – deemen

+0

Peor. Idea. Nunca. Obtenga una herramienta adecuada que se pueda ajustar para proporcionar información de la manera en que se sienta cómodo. No ajuste su código para compensar las herramientas deficientes. Y nunca cambies tu código de una manera que lo rompa por completo. – IInspectable

Cuestiones relacionadas