Frage zu static const



  • Ich habe eine Klasse in der folgende Zeile steht

    QueryPerformanceFrequency((LARGE_INTEGER*)&QPC_Frequency);
    

    Ich möchte QPC_Frequency als static const deklarieren, weil es keinen sinn machen würde für jede Instanz der Klasse QPC_Frequency neu anzulegen. Aber ich kann es ja nicht einfach in die .cpp schreiben wie gewohnt, weil QPC_Frequency ja übergeben wird. Wie sieht die syntax dafür aus?

    Danke!



  • Wieso keine freie Methode (außerhalb der Klasse), dann hättest Du das Problem nicht.

    Edit: Sorry, das ist totaler Blödsinn.



  • Ausserhalb der Klasse CTimer wird QPC_Frequency überhaupt nicht benötigt. Deshalb finde ich sollte es auch in der Klasse bleiben. Oder wie meinst du das?



  • Naja, Du hast doch sicher eine CTimer.cpp und eine CTimer.h ?

    In der CTimer.cpp steht dann einfach:

    static const int QPC_Frequency = <was auch immer>;
    

    Damit kann es in CTimer benutzt werden und keine andere Klasse kriegt es je zu sehen.



  • Ich sehe gerade das Problem nicht.

    // Foo.hpp --------------------------------------------
    
    #include <windows.h>
    
    class Foo
    {
    // ...
        static LONGLONG const s_frequency;
    };
    
    // Foo.cpp --------------------------------------------
    
    #include "Foo.hpp"
    #include <process.h>
    
    namespace { // anonymer namespace für die helper-funktion
    
    LONGLONG GetPerformanceCounterFrequency()
    {
        LARGE_INTEGER f;
        if (!::QueryPerformanceFrequency(&f))
        {
            FehlerAusgeben();
            abort();
        }
        return f.QuadPart;
    }
    
    } // anonymer namespace Ende
    
    LONGLONG Foo::s_frequency = GetPerformanceCounterFrequency();
    


  • @minastaros:

    Ja, so geht es normalerweise. Ich hatte aber das Problem, dass ich den Wert erst aus einer Funktion holen muss.

    @Hustbaer:

    Danke, ich denke es ist das was ich gesucht habe.
    Ich wusste gar nicht, dass man Definitionen so beschränken kann, dass sie nur noch innerhalb einer Datei gefunden werden. Oder hab ich jetzt den Anonymen Namespace falsch verstanden?



  • Nö, ich denke du hast das schon richtig verstanden.

    Wobei IMO auch nix dagegen spricht, die GetPerformanceCounterFrequency öffentlich zu machen. Nicht als Teil der Counter-Klasse, sondern einfach als "freistehende" Hilfsfunktion - für wo auch immer sie gebraucht wird.

    In der Arbeit verwenden wir eine eigene Library voll mit solchen Hilfsfunktionen (und Templates und Klassen). Man muss den Code ja nicht überall duplizieren wo man ihn braucht, auch wenn es "nur Hilfsfunktionen" sind.


Anmelden zum Antworten