Was ist eine static class?



  • Hallo,

    ein gesundes neues erstmal.

    Meine Anfängerfrage: Was bewirkt der zusatz static beim definieren eines Objekts einer Klasse:

    static class baum;

    Ich kenne static Membervariablen und static Methoden, aber Klassen static zu definieren, könnte ich mir nur vorstellen wenn man nur ein Objekt dieser Klasse haben will. Kann das sein?



  • Ich denke in C++ gibt es nur static Felder und Methoden.
    Java und C# bieten statische Klassen an.



  • Also so ist mir das auch noch nicht untergekommen (bestenfalls in C-Programmen, wo irgendwer die Bezeichnung "class" für seine Strukturtypen verwendet hat ;)). Um nur ein Objekt dieser Klasse anlegen zu können, gibt es Singleton-Lösungen - aber die sehen ein wenig anders aus.



  • JDHawk schrieb:

    Meine Anfängerfrage: Was bewirkt der zusatz static beim definieren eines Objekts einer Klasse:

    static class baum;

    Erste Gegenfrage: Arbeitest du wirklich mit C++ oder mit C++/CLI (oder ähnlichem)?

    Den Ausdruck "static class" kenne ich eigentlich nicht aus Ansi C++.

    Möglich ist in C++ aber folgendes:

    class A { /*...*/ };
    
    void foo()
    {
        static A obj;
        // ...
    }
    // ...
    

    Dies würde bewirken das die Funktion foo beim ersten Aufruf ein Objekt der Klasse A anlegt, dieses Objekt aber erst beim Programmende gelöscht wird. Bei jeden weiteren Aufruf wird kein neues Objekt angelegt, sondern das gleiche Objekt verwendet.

    cu André



  • also das

    static class baum;
    

    was oben steht waere sowas wie eine "statische Klassendeklaration" - was es in C++ nicht gibt. Allerdings hat der OP geschrieben "beim definieren eines Objekts", was darauf hindeutet, dass dort ein gewisser Fehler unterlaufen ist. Gemeint sein koennte etwas wie folgt:

    class Foo;
    static Foo baum;
    

    Wobei man in letzterer Zeile jeden Typ benutzen darf, aber eben nicht das Schluesselwort class.
    ⚠ Achtung, geraten: ⚠
    Ich meine mich erinnern zu koennen, mal ne (C-)Funktionsdeklaration gelesen zu haben ala

    void bar(struct Foo f);
    

    wobei Foo eben der Name eines struct-typs ist und das struct nur zur Verdeutlichung (bzw. um eventuelle Namenskonflikte mit Funktionen gleichen Namens - wie eklig - aufzuloesen) dient. Ich koennte mir vorstellen, dass es sowas auch in C++ mit class gibt. Dann fehlt bei besagter Zeile allerdings noch der Variablenname, etwa wie folgt:

    void baum();
    class baum; //geht sowas, funktion und klasse mit gleichem namen?
    
    static class baum b; //statische variable vom typ baum, Name b
                         //das class dient zur Unterscheidung zwischen der Funktion und der Klasse
    

    Wie gesagt, ist nur geraten, ich wuerde moeglichst vermeiden in derartige Situationen zu kommen, wenns ueberhaupt moeglich ist, deshalb kenn ich diese eher unuebliche Verwendung des keywords class/struct nicht so gut, wenn sie denn ueberhaupt existiert. Wie H.Sutter so schoen sagt: "Avoid the dusty corners of the language."



  • Sorry für die Verwirrung.
    Nehme alles zurück asc hat die Frage beantwortet.

    Es handelt sich nicht im eine static class Deklaration sondern um ein statisches Objekt.

    (In meinem Fall gehts wirklich um ein Singleton, bei dem die Instanz bei getInstance() static erzeugt wird und dadurch eben nicht nochmal erzeugt werden kann)

    Sorry nochmals für die Verwirrung!



  • class Foo
    { 
    private:
       Foo() {} 
       Foo(const Foo&) {}
    
    public:
       ~Foo() {}
    
        static Foo& getSingelton()
        { 
            static Foo theOneAndOnly;
            return theOneAndOnly;
        }
    };
    

    So würde das gehen. Es muss dann halt jeder per Foo::getSingleton().example() drauf zugreifen.
    War es das was du wissen wolltest?^^
    Edit:
    Das Objekt kann nicht deshalb nicht nochmal erzeugt werden, weil getSingelton() static ist, sondern weil die Konstruktoren privat sind...
    rya.



  • Scorcher24 schrieb:

    class Foo
    { 
    private:
       Foo() {} 
       Foo(const Foo&) {}
    
    public:
       ~Foo() {}
    
        static Foo& getSingelton()
        { 
            static Foo theOneAndOnly;
            return theOneAndOnly;
        }
    };
    

    Ja genau so.

    War es das was du wissen wolltest?^^

    jepp danke

    Edit:
    Das Objekt kann nicht deshalb nicht nochmal erzeugt werden, weil getSingelton() static ist, sondern weil die Konstruktoren privat sind...
    rya.

    Würd ich nicht sagen. Nur weil theOneAndOnly static ist wird nicht nochmal eins erzeugt. Die Konstruktoren sind ja weiterhin vorhanden, nur das sie halt privat sind. Wenn es nicht static wäre, könnte man unendlich viele Objekte erzeugen.
    Einfach dadurch das man getInstance() beliebig oft aufruft.

    Hab ich da Recht oder bin ich aufn Holzweg?



  • Würd ich nicht sagen. Nur weil theOneAndOnly static ist wird nicht nochmal eins erzeugt. Die Konstruktoren sind ja weiterhin vorhanden, nur das sie halt privat sind. Wenn es nicht static wäre, könnte man unendlich viele Objekte erzeugen.
    Einfach dadurch das man getInstance() beliebig oft aufruft.

    Hab ich da Recht oder bin ich aufn Holzweg?

    Klar, wenn theOneAndOnly nicht static wäre, erzeugt man beliebig viele Objekte mit dem Aufruf von getSingleton().^^ Aber wäre der Konstruktor nicht privat, könnte man auch beliebig viele Instanzen der Klasse erstellen (einfach über Foo myBar etc), da die Klasse nicht vor dem Erzeugen geschützt ist. Hast also schon recht, aber dass der Konstruktor privat ist, ist hier auch ein entscheidendes Element. Es sind also beide Faktoren die da zusammen wirken.
    rya.



  • Und wie ist es mit dem Destruktor?

    Habe auch implementierungen gesehen ohne den Destruktor.

    Bzw. auch erweiterte mit einer separaten Klasse Destroyer, wenn man ableiten will, aber das führt zu weit.



  • Der Destruktor ist natürlich öffentlich, sonst kann das Objekt ja nicht wieder zerlgt werden. Wenn du keinen angibst, dann legt der Compiler einen für dich an.
    rya.


Anmelden zum Antworten