Instanz einer Klasse schon vorhanden?



  • Guten Tag,

    Wie kann ich überprüfen, ob eine Instanz einer Klasse schon existiert?

    Gruß skontox



  • Referenzzählung



  • skontox schrieb:

    Guten Tag,

    Wie kann ich überprüfen, ob eine Instanz einer Klasse schon existiert?

    Gruß skontox

    Gar nicht bzw. du kannst eine private Membervariable mit der Speicherklasse
    static anlegen und bei jedem Konstruktoraufruf inkrementieren und bei jedem Destruktoraufruf dekrementieren.

    class A
    {
    public:
        A() : referenceCount(referenceCount + 1)
        {}
    
        ~A()
        {
            --referenceCount;
        }
    
        bool initialized()
        {
            return referenceCount;
        }
    
        unsigned long countInstanziation()
        {
             return referenceCount;
        }
    
    private:
        static unsigned long referenceCount;
    };
    


  • Besten Dank,
    das finde ich aber ganz schön traurig, dass man das nicht so abfragen kann.
    Naja, aber trotzdem schönen Dank für den Ansatz!

    Gruß skontox



  • skontox schrieb:

    Besten Dank,
    das finde ich aber ganz schön traurig, dass man das nicht so abfragen kann.
    Naja, aber trotzdem schönen Dank für den Ansatz!

    Gruß skontox

    Wieso sollte das traurig sein? Was bringt es dem Programmiere für einen Nutzen das wissen zu können? Es gibt auch Singleton, falls du die Instanziierung beschränken möchtest.



  • Du hast wahrscheinlich recht, wenn man von guten Programmierern mit super Code spricht, aber ich bin leider noch ein Newbie und mein Programmierstil, wohl eher schlecht ist.
    Mein Problem ist einfach dass ich momentan unter Linux mit KDevelop und QT etwas auf die Beine stellen muß.
    WinAPI hab ich schon programmiert und das ging auch ganz gut, aber unter Linux sieht das etwas anders aus.
    Dort habe ich nämlich jedes von mir entworfenes GUI-Fenster als eine Klasse definiert->zwecks besserer Wartung im QT-Designer. Um ein Fenster auf dem Bildschirm zubringen erzeuge ich eine Instanz der Klasse und zeige mit ->show() das Fenster an. Ich dachte nun auf einfache Art und Weise zuverhindern, dass mehrere Fenster vom gleichen Typ vom Benutzer geöffnet werden können, indem ich überprüfe, ob so ein Objekt schon vorhanden ist. Ich weiß das ist so wahrscheinlich nicht sehr gut, aber es wäre eine Lösung gewesen.

    Mit singelton komme ich an dieser Stelle auch nicht weiter, trotzdem besten Dank

    Gruß skontox



  • Dann mach es doch einfach per Referenzzählung. Wenn der Zähler > 0 wird einfach keine neue Instanz erzeugt ein Fehler geworfen etc.



  • Das werde ich wohl auch machen, herzlich Dank nochmal!

    Gruß skontox



  • Ich bekomme das nicht richtig hin. Sprich es kommen immer Fehlermeldungen.

    Meine Fensterklasse steht im Headerfile main_w.h definiert. Die Methoden wollte ich dann in der main_w.h definieren, aber irgendwie klappt das so nicht wie im obigen Beispiel.

    Hier mal mein Code vom main_w.h:

    #ifndef STOCKLIST_WINDOW_H
    #define STOCKLIST_WINDOW_H
    
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <kapp.h>
    #include <qwidget.h>
    
    #include <qlineedit.h>
    #include <qmultilineedit.h>
    
    #include "w_stocklist.h" // header for the QT-StocklistWindow (w_stocklist.ui)
    
    /** Main_window */
    class Stocklist_window : public F_StocklistWindow
    {
      Q_OBJECT
      public:
    
        /** construtor */
        Stocklist_window(QWidget* parent=0, const char *name=0);
    
        /** destructor */
        ~Stocklist_window();
    
        // hier nun die Methode initialized für die Referenzzählung
        bool initialized();
    
        // hier nun die Methode countInstanziation für die Referenzzählung
        unsigned long countInstanziation(); 
    
      private:
        // hier nun die Variable für die Referenzzählung
        static unsigned long refCount_stocklw;  //reference counter
    };
    
    #endif
    

    So das klappt auch schon, da wird nicht gemeckert.
    Allerdings dann im dazugehörigem c-File

    Der Konstruktor hat dort nämlich schon einen Zusatz:

    Stocklist_window::Stocklist_window(QWidget *parent, const char *name) : F_StocklistWindow(parent, name)
    {  
    }
    

    Wie müßte ich da weiter vorgehen um das Beipiel mit der Referenzzählung einzubauen?

    Gruß skontox



  • ++refCount_stocklw;

    (BTW ist der Name nicht irgendwie ein bisschen überflüssig lang? wie wärs mit refCount?)



  • Ja hast recht, ich hatte nur gedacht, wenn ich mehrere Fensterklassen habe, die jeweils ein Referenzcounter besitzen, dann nenn ich den individuell nach der Fensterklasse. Aber da hast Du recht ist unnötig.

    Gruß skontox



  • Ich hab da jetzt zwar was hinbekommen, aber er zählt die Zahlen nicht normal hoch von 1,2,3,4 usw. sondern er gibt mir immer Zahlen durcheinander: 17,67899,56,78 usw. Wie kann denn das sein? Muß der Anfangswert mit 0 initialisiert werden? Aber das geht ja nicht dann würde er jedesmal beim Aufruf den refcount mit 0 initialisieren und er nie weiterzählen.

    Kann mir da jemand bitte weiterhelfen.

    Gruß skontox



  • Müßte mit
    int Stocklist_window::refcount=0;
    gehen...



  • tobidope schrieb:

    class A
    {
    public:
    ...
        ~A()
        {
            --referenceCount;
        }
    ...
    };
    

    Mal eine dumme Frage: Müßte es nicht so aussehen, oder gibt es da eh keinen Unterschied?

    class A
    {
    public:
    ...
        ~A()
        {
            --A::referenceCount;
        }
    ...
    };
    

    Is aber noch früh am Morgen *Koffein-Spiegel überprüf* 😃



  • @fubar:
    1. Version funktioniert auch so.

    Sagt Mal, wie ist eigentlich mit Copy-ctor und sowas?
    Wird das hier nicht auch aufgerufen?
    Soweit ich weiß war in dem Fall die Anzahl der ctor- und dtor-Aufrufe unterschiedlich.

    MfG MAV



  • Ist es nicht besser, einen Singleton zu verwenden, wenn er sowieso verhindern möchte, dass es mehrere Fenster (Klassen) vom gleichen Typ geben soll?



  • fubar schrieb:

    Müßte mit
    int Stocklist_window::refcount=0;
    gehen...

    auf jedenfall musst du in einer übseretzungsunit mindestens folgendes stehen haben:

    int Stocklist_window::refcount; //implizit =0
    

    ansonsten dürftest du refcount gar nicht verwenden (können).

    wenn du wirklich nur eine einzige instanz brauchst, dann ist das Singleton Pattern wohl am besten dafür geeignet. Google mal danach 🙂


Log in to reply