Wie greift man auf statische Klassenmember zu?



  • int globalFunction();
    
    // usw. usf.
    
    class Blatt{
    protected:
     static unsigned blattCount;
     static Blatt* blaetter;
    
     friend int globalFunction();
    
    // usw. usf.
    };
    
    /* So und wie schreibt man jetzt richtig die globalFunction ? */
    
    // So (Variante 1)
    int globalFunction(){
     for(int i; i < Blatt::blattCount; i++){
       // usw. usf.
     }
    
    }
    
    // Oder So (Variante 2)
    int globalFunction(){
     for(int i; i < Blatt.blattCount; i++){
       // usw. usf.
     }
    
    }
    

    Also entweder :: oder . ?



  • . kannst du nur verwenden, wenn du ein Objekt hast.



  • wobei es eine ganzeMenge leute schöner finden wenn man generell über :: zugreift.



  • darthdespotism schrieb:

    wobei es eine ganzeMenge leute schöner finden wenn man generell über :: zugreift.

    Oh, du und wer noch? 😉



  • otze schrieb:

    darthdespotism schrieb:

    wobei es eine ganzeMenge leute schöner finden wenn man generell über :: zugreift.

    Oh, du und wer noch? 😉

    War ne Zeit mal eine Diskusion in de.comp.lang.iso-c++ vll find ich noch den followup



  • danke fuer die Tipps.
    Mit den statischen Klassenelementen ist das immer so eine Sache, die Grenzen zwischen einer statischen Klassenvariablendeklaration und einer statischen Klassenvariablendefinition verlaufen scheinbar fließend.

    Einerseits besteht ein Definitionszwang. Wenn ich die Definition in der gleichen Datei notiere, in der der Rest der Klassenfunktionalitaet implementiert ist, also auch ausserhalb der Header-Datei, in der die Klasse deklariert ist, treten folgende Probleme auf:

    Wenn ich den Header zu meiner main() mit #include dazunehme, und bei den 'zusätzlichen Abhängigkeiten/Bibliotheken' die Datei mit der Implementierung zur main-Datei dazulinken lassen möchte, meint der Compiler (Linker?) entweder, dass die statischen Klassenelemente überhaupt nicht definiert wurden, oder auch manchmal, dass die statischen Klassenelemente mehrfach definiert wurden. Kommt darauf an, ob Compiler/Linker einen guten Tag erwischt haben oder nicht. So scheint es.

    Auch bei den friend-Deklarationen gibt's ähnliche Probleme, wenn die friend-Funktion in einer externen Datei definiert ist.

    Irgendwann komme ich schon noch hinter die Geheimnisse der statischen Klassenmember.

    Erstmal danke für den Tipp mit der richtigen Schreibweise.



  • ich versteh den Sinn deiner Klasse nicht ^^

    class book
    {
        class page
        {
            std::string m_content;
            std::size_t m_num;
        };
        std::vector <page> m_pages;
    
    public:
        std::size_t get_page_count() const { return m_pages.size(); }
    };
    

    wäre sinniger ...



  • Die statischen Elemente Blatt* und Count sollen Buch darüber führen, wieviele Objekte der Klasse gerade existieren und ausnahmsweise einer einzigen globalen Funktion soll es erlaubt sein, über static Blatt* und static Count indirekt auf die Objekte zugreifen zu dürfen. Deshalb sind Blatt* und Count auch protected.



  • Konkrete Skizze:

    class Zeichenblatt{
    protected:
    static Zeichenblatt* drawPaper;
    static unsigned drawPaperCount;
    
    friend LRESULT CALLBACK defaultPainter(HWND hwnd, MSG msg, WPARAM wParam,
     LPARAM lParam);
    
    // nicht-statische Elemente
    COLORREF graphColor;
    HWND childHwnd;
    RECT childArea;
    
    // ...
    };
    

    Der Konstruktor gibt legt bei einer erfolgreichen Zeichenblatt-Konstruktion den this Zeiger in drawPaper ab, der defaultPaper kann dann sinngemäß zeichnen.

    Vielleicht auch ein übles Fehl-Design, aber was soll's, was anderes ist mir nicht eingefallen.

    mfg


Anmelden zum Antworten