2011-06-18 11 views
7

Quando si lavora con C++ nativo in Visual Studio, intellisense mostra membri e funzioni privati ​​anche al di fuori dell'ambito della classe contenente. Ciò rende difficile creare API pulite per le classi che scrivo.Perché intellisense di Visual Studio mostra membri e funzioni privati?

C'è una ragione per questo? Questo può essere prevenuto?

+0

@Keoki Ci proverò un po 'più difficile :) – aligray

+0

Stai cercando di impedire che ciò accada quando i client usano il tuo codice? Dubito che sarebbe possibile. Se si tratta di un'impostazione in MSVC, chiunque utilizzi la propria API dovrebbe averla attivata. – RageD

+1

@Keoki: Esiste con alcune soluzioni Intellisense di terze parti come Visual Assist X, ma non è integrato in Visual Studio. – ildjarn

risposta

2

Bene, perché non dovrebbe mostrare anche quelli privati? Sono membri, dopo tutto, esistono e sono perfettamente accessibili da determinati contesti, proprio come qualsiasi altro membro.

Sarebbe molto difficile per IntelliSense determinare se i membri sono accessibili o meno da questo specifico contesto, specialmente se si tiene conto che nella maggior), il che significa che è generalmente impossibile analizzarlo.

+0

Penso che imparerò solo a conviverci. – aligray

+4

Intellisense è così produttivo perché si restringe verso l'ambito più specifico possibile. Se ogni volta che iniziassi a scrivere mostrava ogni singola classe in ogni singolo spazio dei nomi in ogni assemblea, non sarebbe altrettanto efficace. Al contrario, il lavoro consiste nel restringere il più possibile l'ambito. Mostra solo i tipi negli assembly attualmente caricati e negli spazi dei nomi attualmente importati.Quando si selezionano i membri, dovrebbe mostrare solo i membri che rientrano nel campo di applicazione, quelli accessibili pubblicamente. – Despertar

+1

-1 Visual Studio utilizza il front-end del compilatore EDG per il supporto IntelliSense. Non c'è niente di difficile nel determinare il livello di accesso di un dato simbolo in un dato contesto. EDG fornisce un AST completo. – IInspectable

3

Il motivo probabilmente solo Microsoft lo sa. (Penso che Intellisense non controlli dove sei in questo momento, quindi non sa se sei all'interno della classe (e puoi accedere ai membri privati) o all'esterno)

In realtà non so se o come può essere prevenuto.
Ma per quanto ne so, hanno un'icona con un lucchetto in modo da sapere che sono privati. Forse questo aiuta

+1

Ovviamente potrebbe essere prevenuto. Intellisense in C++ non è neanche lontanamente buono come lo è per i progetti .NET. Dato, sono sicuro che è più difficile da implementare per C++. –

+1

@Ed S .: l'hai usato in VC 2010? A questo punto è praticamente alla pari con .NET. –

+0

@Billy: In realtà questo è un buon punto ed è divertente l'ho lasciato fuori. Ho usato VC10 solo la scorsa notte per la prima volta e la compilation in background e intellisense erano entrambi molto carini. Questo era un progetto in C, non in C++, ma comunque molto buono. –

0

Sfortunatamente, questo funziona solo per qualsiasi cosa tu faccia, ma è ancora qualcosa da tenere a mente se usi molte delle tue librerie.

Una cosa che ho fatto per tutte le librerie che faccio è cercare di ingannare intellisense con un #define. Nella mia dichiarazione di classe nel file di intestazione per qualsiasi biblioteca sto facendo, mi circondo tutta la parte privata in uno spazio #ifdef, ad esempio

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

Poi, nella sezione di codice della classe in cui ho bisogno di fornire definizioni per tutti i metodi, in alto prima di includere il file con le dichiarazioni di classe, aggiungo

#define MYCLASS_SHOW_PRIVATE_VARIABLES 

in questo modo, i membri privati ​​sono visibili solo ai metodi di implementare per la classe nel file di origine. Qualsiasi client che usi questa libreria non sarebbe in grado di vedere le variabili private tramite intellisense, a meno che, naturalmente, non capiti di definire la direttiva del pre processore.

+2

Amico non cambierebbe la dimensione delle tue classi in base al fatto che tale definizione sia presente o meno? Se qualcuno impila i tuoi corsi, sarai fregato. – deemen

+0

Peggiore. Idea. Mai. Ottieni uno strumento adatto che possa essere regolato per fornire informazioni nel modo in cui ti senti a tuo agio. Non modificare il codice per compensare gli strumenti scadenti. E non cambiare mai il tuo codice in un modo che lo spezza completamente. – IInspectable

Problemi correlati