2011-06-18 14 views
7

Podczas pracy z natywnym językiem C++ w Visual Studio, intellisense wyświetla prywatne elementy i funkcje nawet poza zakresem klasy zawierającej. Utrudnia to tworzenie czystych API dla klas, które piszę.Dlaczego intellisense Visual Studio pokazuje prywatnych członków i funkcje?

Czy istnieje ku temu powód? Czy można temu zapobiec?

+0

@Keoki Postaram się nieco mocniej :) – aligray

+0

Czy próbujesz zapobiec temu, gdy klient używa Twojego kodu? Wątpię, by to było możliwe. Jeśli jest to ustawienie w MSVC, każdy, kto używa Twojego API, musi go włączyć. – RageD

+1

@Keoki: Istnieją rozwiązania Intellisense innych firm, takie jak Visual Assist X, ale nie ma wbudowanego w Visual Studio. – ildjarn

Odpowiedz

2

Dlaczego więc nie powinno pokazywać również prywatnych? Są członkami, mimo wszystko, istnieją i są doskonale dostępne z pewnych kontekstów, tak jak każdy inny członek.

Byłoby bardzo trudno dla IntelliSense określić, czy członkowie są dostępni, czy nie, z tego konkretnego kontekstu, zwłaszcza jeśli weźmie się pod uwagę, że w większości przypadków ten kontekst nie jest jeszcze zakończony (użytkownik wciąż pisze to), co oznacza, że ​​zasadniczo nie można go analizować.

+0

Myślę, że po prostu nauczę się z tym żyć. – aligray

+4

Intellisense jest tak produktywny, ponieważ zawęża się do najbardziej konkretnego zakresu. Jeśli za każdym razem, gdy zaczniesz pisać, pokazuje ona każdą klasę w każdym obszarze nazw w każdym zestawie, co nie byłoby tak skuteczne. Zamiast tego zadaniem jest zawężenie zakresu w miarę możliwości. Wyświetla tylko typy w aktualnie ładowanych złożeniach iw aktualnie zaimportowanych przestrzeniach nazw.Wybierając członków, powinni oni pokazywać jedynie członków, którzy są w zakresie, tych publicznie dostępnych. – Despertar

+1

-1 Visual Studio używa interfejsu frontowego kompilatora EDG do obsługi IntelliSense. Nie ma nic trudnego w określeniu poziomu dostępu dowolnego symbolu w danym kontekście. EDG zapewnia pełną AST. – IInspectable

3

Powód prawdopodobnie tylko Microsoft wie. (Myślę, że Intellisense nie sprawdza, gdzie aktualnie jesteś, więc nie wie, czy jesteś w klasie (i masz dostęp do prywatnych członków) lub na zewnątrz). jak można temu zapobiec.
Ale o ile mi wiadomo, mają ikonę z zamkiem, więc wiesz, że są prywatne. Być może to pomaga

+1

Oczywiście można temu zapobiec. Intellisense w C++ nie jest tak dobry jak w przypadku projektów .NET. Biorąc pod uwagę, jestem pewien, że jest trudniejsze do wdrożenia dla C++. –

+1

@Ed S .: Czy używałeś go w VC 2010? W tym momencie jest prawie na równi z .NET. –

+0

@Billy: Właściwie to dobra racja i to zabawne, że to opuściłem. Użyłem VC10 po raz pierwszy zeszłej nocy, a kompilacja tła i intellisense były bardzo miłe. To był projekt C, nie C++, ale nadal bardzo dobry. –

0

Niestety, działa to tylko dla wszystkiego, co TY, ale wciąż jest o czym pamiętać, jeśli używasz wielu własnych bibliotek.

Jedną z rzeczy, którą zrobiłem dla bibliotek, które tworzę, jest próba oszukania intellisense za pomocą #define. W mojej deklaracji klasy w pliku nagłówka dla biblioteki cokolwiek robię, ja otaczają całą część prywatna w przestrzeni #ifdef, na przykład

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

Następnie w sekcji kodu klasy gdzie muszę dostarczają definicje wszystkich metod na szczycie przed tym pliku z deklaracji klasy, dodaję

#define MYCLASS_SHOW_PRIVATE_VARIABLES 

ten sposób prywatne członkowie są widoczne tylko dla metod wdrożyć do swojej klasy w pliku źródłowym. Wszyscy klienci korzystający z tej biblioteki nie będą mogli zobaczyć prywatnych zmiennych za pomocą pakietu intelliSense, o ile oczywiście nie zdefiniują one dyrektywy wstępnej procesora.

+2

Dude, czy to nie zmieniłoby rozmiaru twoich klas w oparciu o to, czy ten jest tam, czy nie? Jeśli ktokolwiek stawi twoje klasy, zostaniesz spuszczony. – deemen

+0

Najgorszy. Pomysł. Zawsze. Uzyskaj odpowiednie narzędzie, które można dostosować w taki sposób, aby zapewniało informacje w sposób komfortowy. Nie dostosowuj swojego kodu, aby zrekompensować słabe narzędzia. I nigdy nie zmieniaj kodu w sposób, który całkowicie je zepsuje. – IInspectable

Powiązane problemy