mein Visual Studio (Projekt?) spinnt! [public/private, Intellisense]



  • Hallo allerseits!

    Ich habe im Moment folgende, ziemlich unangenehme Probleme:

    Probleme mit Intellisense: *(Ich habe bereits die .ncb Datei gelöscht, nutzte nichts...)*1. In der aktuellen Version meines Projektes funktioniert Intellisense nicht für neu hinzugefügte Klassen.
    z.B.:

    CNeueKlasse neueklasse, *nk= &neueklasse; //CNeueKlasse ist natürlich nicht leer und verfügt über public Member
    nk-> //hier sollte normalerweise das Intellisensemenü aufpoppen, tut es aber nicht! :(
    neueklasse. //hier auch :(
    

    Bei "alten" Klassen ist alles kein Problem.

    1. Allgemein dauert der "updating Intellisense" (Statusleiste) Vorgang immer recht lang und Visual Studio (bzw. der Prozess devenv.exe) benötigt volle CPU Last.
    2. Noch schlimmer ist das Phänomen aus 2. beim Hinzufügen von Klassen: Das dauert knapp Minutenlang und Visual Studio (bzw. der Prozess devenv.exe) benötigen über die ganze Zeit nicht nur volle CPU Last, sondern verlangen auch mehrere 100 MB Arbeitsspeicher.

    Diese Probleme kamen von einem Tag auf den anderen.
    An diesem Tag führte ich zwei wesentliche Änderungen am Projekt durch:

    1. Die Einführung zahlreicher namespaces, damit globale Variablen nicht so nackt da rum liegen.
    2. Ich begann mir abzugewöhnen, nur mit access = public für Member zu arbeiten und versuchte, einige Varaiblen und Funktionen als private anzulegen.

    zu (a):
    Die Einführung der namespaces sah stets etwa so aus:
    Aus

    //beispiel.cpp
    ...
    int test;
    ....
    

    wurde

    //beispiel.cpp
    ...
    namespace ns_beispiel
    {
        int test;
    }
    using namespace ns_beispiel;
    ....
    

    und das für einige Dateien (knapp unter 20).

    Habe ich da etwas falsch oder ungünstig gemacht, woran Visual Studio sich jetzt verschluckt? Wäre es besser, die namespaces anders (z.B. zentral) zu deklarieren?

    zu (b)
    Der Add Member Wizard macht Mist bei Variablen mit dem Zugriffsrecht "private" (Und zwar nicht nur bei meinem aktuellen Projekt, sondern auch bei neuen Testprojekten):

    class CTestklasse
    {
    public:
    	CTestklasse(void);
    public:
    	~CTestklasse(void);
    
    public:
    	int publictest;
    	int privatetest; //das sollte eigentlich private sein!
    public:
    	int publictest2;
    };
    

    Die Variable int privatetest fügt ich mit dem Zugriffsrecht private hinzu. Und tatsächlich wurde das sonst immer verwendete "public" weggelassen. Aber natürlich reicht das ja hier nicht, weil oben drüber das "public:" von int publictest steht! (Auch in den Properties von "privatetest" erkennt VS den access als "public")
    Ist es mit Visual Studio 2005 etwa nicht möglich, automatisch private Member hinzuzufügen?

    Jedenfalls fügte ich daher einige private von Hand ein, z.B.:

    class CTestklasse
    {
    public:
    	CTestklasse(void);
    public:
    	~CTestklasse(void);
    
    public:
    	int publictest;
    private:
    	int privatetest;
    public:
    	int publictest2;
    };
    

    Ist das etwas, woran sich Intellisense verschlucken könnte?

    Also nochmal allgemein meine Frage:
    **
    Hat jemand eine Idee (oder Erfahrungen), woran diese Probleme liegen könnten und wie ich sie wieder loswerde?**

    Danke und Gruß,
    Dong

    übrigens: Eine Testversion von Whole Tomatos Visual Assistent habe ich übrigens auch schon ausprobiert, das brachte keine Äanderung.



  • Könnte vielleicht sein, dass die *.opt - Datei inzwischen zu gross ist...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39072.html (hier unter P.S. erwähnt).



  • isabeau schrieb:

    Könnte vielleicht sein, dass die *.opt - Datei inzwischen zu gross ist...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39072.html (hier unter P.S. erwähnt).

    Ich habe gar keine .opt Datei...
    ...aber mittlerweile sitze ich an einem anderen Rechner und habe zum einfacheren Transport nur die *.cpp, *.h, *.rc und die *.sln in ein Archiv gepackt, nach dem Auspacken funktionierte zumindest Intellisense wieder auf dem anderen Rechner. (Mal gespannt, wie das ist, wenn ich wieder zu Hause bin...)

    Das Problem mit der Unfähigkeit von Visual Studio, Membervariablen als "private" anzulege, habe ich hier (auf dem anderen Rechner) allerdings auch.

    Gruß,
    Dong



  • So, ich konnte das Problem jetzt besser nachvollziehen und reproduzierbar gestalten:

    Das private/public Problem und das Intellisense Problem haben nämlich tatsächlich miteinander zu tun!

    Und zwar folgendermaßen:

    1. Wie erwähnt ist der "Add Member Variable Wizard" von meinem Visual Studio 2005 nicht in der Lage, richtig eine Variable mit dem Zugriffsrecht "private" zu einer Klasse hinzuzufügen. Das Ergebnis eines derartigen Versuchs sieht im Header so aus:
    class CTestklasse
    {
    public:
    	CTestklasse(void);
    public:
    	~CTestklasse(void);
    public:
    	int publictest;
    	int privatetest;
    }
    

    also kurz gesagt: Das Schlüsselwort "private" fehlt. (Ja, ich weiß, dass ist zwar in Klassen default, aber darüber steht eben ein "public", daher ist auch "privatetest" public.)

    1. Eine Membervariable wird erst "private", wenn man das bei den "Properties" oder von Hand ändert:
    class CTestklasse
    {
    public:
    	CTestklasse(void);
    public:
    	~CTestklasse(void);
    public:
    	int publictest;
    	int privatetest;
    public:
    	int publictest2;
    private:
    	int privatetest2;
    };
    
    1. Alle Variablen, die danach (nach einer "richtigen" private Variable) hinzugefügt werden, werden von Intellisense (und der Virtual Assist Trial Version) nicht mehr erkannt.
      Man vergleiche:
      Intellisense Screenshot (23kB) [publictest3 fehlt bei Intellisense!] mit dem Header:
    class CTestklasse
    {
    public:
    	CTestklasse(void);
    public:
    	~CTestklasse(void);
    public:
    	void buhfunktion(void);
    public:
    	int publictest;
    	int privatetest;
    public:
    	int publictest2;
    private:
    	int privatetest2;
    public:
    	int publictest3;
    };
    

    [edit]Update: Wenn hingegen alle public Variablen vor der ersten private Variable stehen, geht Intellisense wohl. (*Daumen drück dass das so bleibt...*)[/edit]

    Trotzdem nervig, dass das nicht von Anfang an richtig geht.
    Hat jemand eine Idee?

    Danke und Gruß,
    Dong



  • Ich kann nur eins sagen, dass Intellisense im VC8 ist sehr gut für C# aber für C++ nicht unbedingt zu gebrauchen. Das die Aktualisierung der DB für das Intellisense quasie das System lahmlegt ist bekannt und es gibt auch einen Hotfix dafür.

    Ansonsten kann ich dir nur Visual Assist empfehlen. Es gibt nix besseres.

    Gruss

    PS. wholetomato



  • BEamer schrieb:

    Ansonsten kann ich dir nur Visual Assist empfehlen. Es gibt nix besseres.

    Genau. Jedesmal, wenn ich mich an ein Visual Studio ohne VA setze, fühle ich mich irgendwie amputiert.



  • @BEamer & jencas:

    dong (im obersten Beitrag) schrieb:

    übrigens: Eine Testversion von Whole Tomatos Visual Assistent habe ich übrigens auch schon ausprobiert, das brachte keine Änderung.

    😉 OK, ich gebe zu, das Programm heißt "Visual Assist" und nicht "Visual Assistent", wie ich ursprünglich schrieb.

    Aber ansonsten habt Ihr recht: Visual Assist ist schon genial, gefällt mir bereits nach kurzer Zeit sehr gut! 🙂

    Aber trotzdem lag das Problem wie gesagt nicht in der Frage ob natives Intellisense oder Visual Assist, sondern wohl eher darin, dass der "Add Member Wizard" Header produziert, die zum Teil falsch und zum Teil für Intellisense/Visual Assist schlicht unverständlich sind. Komisch...

    (Konntet Ihr das auch schon so beobachten? Hinzufügen einer public, einer private und dann wieder einer public Variablen führt wie oben beschrieben zu:

    class CTestklasse
    {
    public:
        CTestklasse(void);
    public:
        ~CTestklasse(void);
    public:
        int publictest;
        int privatetest;
    public:
        int publictest2;
    };
    

    statt:

    class CTestklasse
    {
    public:
        CTestklasse(void);
    public:
        ~CTestklasse(void);
    public:
        int publictest;
        int publictest2;
    private:
        int privatetest;
    };
    

    oder:

    class CTestklasse
    {
        int privatetest;
    public:
        CTestklasse(void);
        ~CTestklasse(void);
        int publictest;
        int publictest2;
    };
    

    Wenn ja: Wie umgeht Ihr das Problem?)

    Gruß,
    Dong


Anmelden zum Antworten