Wann Klasse komplett static?



  • Guten Abend,

    Bei der Clanlib ist mir aufgefallen, dass die meisten Klassen komplett static sind. Nun finde ich es oftmals sehr praktisch wenn bspw. eine Graphik Klasse static ist, da man sich dann das Weiterreichen an andere Klassen, wie Sprite oder GUI, spart. Aber ist es denn korrekt sozusagen alles global zu machen. Was für Nachteile entstehen? Bei welchen Klassen ist es sinnvoll?

    Statiker



  • static hat mindestens 3 Bedeutungen. Von welcher sprichst du?



  • Hallo,

    Also ich meine statische Klassenmember und statische Klassenmethoden. Also bspw. :

    class foo
    {
        static int bar;
    public:
        foo();
        ~foo();
        static whatdoyouwant();
    };
    
    int foo::bar;
    

    Das die Methoden und Member einfach immer verfügbar sind.

    Statiker



  • er meint bestimmt das:

    class klasse
    {
    public:
    static void statischeFunktion();
    };

    void main()
    {
    klasse::statischeFunktion();
    }

    [edit]Sorry, hab die Frage gleichzeitig mit Statiker beantwortet [/edit]



  • @Statiker
    Imo sollte man Klassen niemals komplett static machen. Wenn du genau eine Instanz brauchst, dann definiere die Klasse normal und sorge dafür, dass du auch nur eine Instanz hast. Für dieses Problem gibt es auch ein Design Pattern ➡ Singleton.
    Eine einfache Implementierung könnte zB wie folgt aussehen:

    class foo
    {
    private:
        int bar;
    public:
        foo();
        ~foo();
        whatdoyouwant();
        static foo& instance()
        {
            static foo foo_instance;
            return foo_instance;
        }
    };
    

    Der Trick hierbei ist die Funktion instance, da diese immer dieselbe Instanz zurückgibt. Der Zugriff sieht dann entsprechend aus

    foo::instance().whatdoyouwant();
    

    Natürlich können wir auch noch etwas mehr Syntax Zucker reinbringen. Dazu erstellen wir noch eine weitere Referenz nach der Klassendefinition

    namespace
    {
        foo& my_foo = foo::instance();
    }
    //....
    my_foo.whatdoyouwant();
    

    So fühlt sich das doch schon wie eine ganz normale Instanz an und macht uns glücklich. 🙂



  • @groovemaster

    Du solltest dann aber auch Konstrukor und Destruktor private machen 😉
    Sonst ist man nicht gezwungen instance() aufzurufen.



  • @Statiker
    Wenn ich deine Frage lese, hege ich den stillen Verdacht, dass du nicht wirklich objektorientiert programmierst, sondern die Klassen nur dazu nutzt deine Funktionen zu gruppieren.

    Klassen bestehen normalerweise nicht nur aus Funktionen, sondern auch aus Member-Variablen. Funktionen, die nur angewendet werden können, wenn du einen Satz dieser Member-Variablen hast.
    Meiner Meinung nach ist es eher umständlich diese Menge an Parametern jedesmal zu übergeben nur damit meine Funktion statisch ist. Außerdem bist gezwungen die Parameter jedesmal auf Richtigkeit zu überprüfen.
    Wenn du mit nicht statischen Funktionen arbeitest brauchst du sie nicht als Parameter zu übergeben und kannst gleichzeitig beim Setzen der Variablen (über Set-Funktionen) dafür sorgen dass diese immer in einem gültigen Zustand sind.
    Ganz abgesehen davon, dass es noch sowas wie Polymorphie gibt.... (da is es aber glaub ich besser wenn du dir ein C++-Buch zu gemühte führst.)



  • phlox81 schrieb:

    @groovemaster

    Du solltest dann aber auch Konstrukor und Destruktor private machen 😉

    Implementationsdetails. Ich hab die Klasse einfach nur von Statiker kopiert, insofern sollte nur das Prinzip erkennbar sein, und keine Garantie auf Vollständigkeit gegeben sein. Zumindest den ctor nicht öffentlich bekannt zu machen, ist dennoch sinnvoll.



  • Hallo,

    Danke für eure Antworten! Hat mir sehr geholfen!

    Statiker


Anmelden zum Antworten