"static int" verwenden und compilerfehler



  • DUrhc das Froum bin ich auf BKSHome http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=static#Answ
    aufmerksam geworden,habe aber mit seinem Beispiel Probleme:

    #include <iostream> // Ein-/Ausgabe
    using namespace std;
    class A
    {
        // Achtung: Dies ist nur die Deklaration.
        // Es wird noch kein Speicher belegt.
        static int ObjCount;
        public:
            A() {ObjCount++;}
            ~A() {ObjCount--;}
    
            static int GeObjCount() {return ObjCount;}
    
    };
    // Hier ist die Definition.
    int A::ObjCount = 0;
    
    int main()
    {
        cout << "Es gibt: " << A::GeObjCount() << " Objekte des TypsA" << endl;
        A a1, a2;
        cout << "Nun gibt es: " << A::GeObjCount() << " Objekte." << endl;
    }
    

    Die Deklariton würde ich in eine eigene Datei schreiben. Aber wohin gehört dann

    int A::ObjCount = 0;
    

    in das klassenFile oder zum main-file?
    Woher weiß das ausführende Programm, daß ObjCount auf 0 zu setzen ist, wenn die Codezeile nicht aufgerufen wird ?? Oder fügt der CompilerCode hinzu, der bei Programmstart nur einmal ausgeführt wird, um eben ObjCount auf 0 zu setzen ??

    Frage zwwei:
    wenn ich versuche zu compilieren, erhalte ich als erste von vielen diese MEldung

    hannsw@nuc-hormon-server:~/btrieve/trial> gcc static.cc
    /tmp/ccQ8GqoS.o(.text+0x15): In function main': : undefined reference tostd::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
    /tmp/ccQ8GqoS.o(.text+0x39): In function main': : undefined reference tostd::cout'



  • Für C++ benutzt man doch den g++ Compiler und nicht gcc. 😕 😕 😕



  • Ich glaube, wenn du das gcc-frontend benutzt und er sich die Sprache selbst raussuchen muss, musst du ihm die libraries, die der g++ implizit mitlinkt, explizit mitgeben. In diesem Fall sollte entweder

    gcc -lstdc++ static.cc
    

    oder, besser

    g++ static.cc
    

    funktionieren.



  • g++ war nicht schlecht,

    Aber, wie ist das mit der zweiten Frage?



  • Er findet die benötigten Symbole für die STL nicht, welche gcc Fassung nutzt du denn? Eigentlich sollte eine neuere g++-Version alle Probleme dieser Art lösen, da (wie oben gesagt) die benötigten Runtime-Libs automatisch mit hinzugelinkt werden.

    MfG Kimmi



  • alle statischen Variablen werden nach programmstart, aber vor eintritt in die main(), initialisiert mit dem Wert, der zugewiesen wurde.
    Die Definition deines statischen Ints gehört in die .cpp zu der Klasse, nicht zur cpp mit der main. Schließlich gehört sie auch zu der Klasse, und wenn du z.B. die Klasse in einem anderen programm wieder benutzen willst, müsstest du sonst jedesmal wieder die Definition schreiben...



  • ja, danke für den Hinweis, ähnliches hatte ich mir auch überlegt.

    Man kann dann feststellen, daß für statische Vars einer Klasse auch dann speicherplatz belegt wird, selbst wenn keine Instanz der Klasse erzeugt wird?!

    ICh hatte eben Bedenken, daß ich als "böswilliger" Programmierer auf diese Var zugreifen kann; ich deklariere jedoch als zur Klasse gehörend mit

    static int A::ObjCount
    

    und erhalte so den Schutz vorm Zugriff von Außerhalb ber Klasse.
    [/cpp]static int GeObjCount() {return ObjCount;}[/cpp]
    wäre es ein (compiler-)Fehler, diese funktion NUR als

    int GeObjCount() {return ObjCount;}
    

    zu deklarieren?
    Wenn ich meine Klasse weitergebe, und "getObjCount()" beschreibe, als "gibt die Anzahl existierender Objecte dieser Klasse als integer an", dann sollte dies doch dem Anwender reichen, denn ihm sollte es doch egal sein, WIE das letzendlich implementiert ist?

    Ich habs probiert:

    21:int GeObjCount() {return ObjCount;}
    

    ergibt den Compiler Fehler

    static.cc:21: error: cannot call member function `int A::GetObjCount()' without object

    Der compiler schaut demnach nach, welcher Typ nach dem return steht, und vergelchte es mit dem deklarierten Wert?
    Muss wohl.
    Danke fürs zuhören
    Hanns



  • der Compilerfehler beruht darauf, dass nicht-statische Methoden nur für ein bestehendes Objekt aufgerufen werden können, da z.B. bei nicht-statischen Methoden immer der this-Zeiger mit übergeben wird. wenn du auch ohne gerade so ein Objekt zur hand zu haben, wissen möchtest, wieviele Objekte es von dem Typ gibt, dann musst du die Methode ebenfalls als static deklarieren:

    static int GeObjCount() {return ObjCount;};
    

    OOP-technisch kann man auch (meist) sagen: "normale" Attribute und Methoden sind Fähigkeiten der Objekte, also der einzelnen Instanzen einer Klasse. static Attribute und Methoden sind hingegen Fähigkeiten der Klasse als Ganzes.
    Allgemein sollte man auch den Zugriff auf ein statisches Attribut ebenfalls statisch machen.

    Was den "böswilligen Programmierer" angeht: Membervariablen sind immer Privatsache. Denn wie genau die Daten in einer Klasse gespeichert sind, ist Implementierungsdetail und sollte möglichst nicht offen zugänglich gemacht werden. Abgesehen davon hat es sich eingebürgert, alles und jeden über Methoden anzusprechen, und dann kommt es doch etwas unerwartet, wenn man plötzlich mit einer echten membervariablen konfrontiert wird.


Anmelden zum Antworten