Globale Klasseninstanz



  • Ich habe mehrere Projekte, die alle gemeinsam haben das ich in jedem nur genau eine Instanz einer Klasse benötige.
    In der Regel handelt es sich dabei um ein Laborgerät, z.B. einen Positioniertisch, das angesteuert wird.

    Meine erste Idee war es diese Klasse in main.cpp (bzw dem Equivalent in MFC) zu initialisieren. Das hat aber das Problem, dass ich in allen Dialogen die main.h laden muss und diese Dialoge in main.h mit ihren dialogx.h geladen werden, so dass ich rekursiv Header Dateien laden. Das hat zu sehr unschönen unlogischen fehlern geführt: http://www.c-plusplus.net/forum/viewtopic-var-t-is-190495-and-highlight-is-.html

    Wenn ich das innerhalb eines Dialogs initialisier, dann muss ich bei der Übergabe der Klasseninstanz an einen anderen Dialog (und damit eine andere Klasse) ein casting machen. Auch sehr unschön.

    Folgende Lösung scheint zu funktionieren, ich wüsste aber gerne eure Meinung dazu

    #pragma once
    #include "PI_C862Mercury.h"
    extern PI_C862Mercury Verschiebetisch;
    
    #include "StdAfx.h"
    #include "GlobalClasses.h"
    PI_C862Mercury Verschiebetisch;
    

    dann kann ich mit Laden von '#include "GlobalClasses.h"' in jeder Klasse auf die Instanz 'Verschiebetisch' zugreifen.

    Matthias



  • Hallo,

    Belies dich doch mal zum Thema Singleton. Ich denke das ist genau was du brauchst.
    z. Bsp. hier http://www.oop-trainer.de/Themen/Singleton.html
    Von diesen globalen Variablen halte ich gar nichts.



  • Braunstein schrieb:

    Hallo,

    Belies dich doch mal zum Thema Singleton. Ich denke das ist genau was du brauchst.
    z. Bsp. hier http://www.oop-trainer.de/Themen/Singleton.html
    Von diesen globalen Variablen halte ich gar nichts.

    Ich sehe da zwar viel Text und einigen Code aber nicht mal eine Einleitung wozu das ganze da sein soll.

    Und was spricht gegen Globale Variablen? Der wesentlich Punkt hierbei ist ja gerade das ich es in praktisch allen Klassen des Projektes benötige und immer mit der gleichen Instanz.

    Matthias



  • pospiech schrieb:

    Der wesentlich Punkt hierbei ist ja gerade das ich es in praktisch allen Klassen des Projektes benötige und immer mit der gleichen Instanz.

    ...und genau diesen Anspruch erfüllt das Singleton-Muster 😉 . Die Erkärung hier ist vielleicht etwas nachvollziehbarer. Ich bevorzuge übrigens die Heap-Variante, da bei dieser sichergestellt ist, dass die Instanz bei Programmende zerstört wird.

    Grüße

    Martin



  • Ich will nicht verhindern dass es mehr als eine Instanz geben kann, ich will nur das diese eine in allen Klassen verfügbar ist.

    Wenn ich nun eine Klasse mit einem Singleton Template definiere

    test.h

    class Test : public Singleton <Test>
    {
    ...
    

    wie muss ich dann diese Klasse Initialisieren, so dass diese in allen anderen Klassen verfügbar ist?

    Matthias



  • garnicht, der erste zugriff erzeugt das object ...
    (oder der programmstart)



  • Treb schrieb:

    garnicht, der erste zugriff erzeugt das object ...
    (oder der programmstart)

    Eine Klassenstructur liefert mir aber doch kein Objekt zurück. Ich muss also irgendwo ein

    Test Testinstanz
    

    stehen haben.

    Wenn das in Klasse A steht, woher kennt dann Klasse B die Instanz?

    Vielleicht brauche ich ja auch nur ein vollständiges Beispiel um es zu verstehen.

    Matthias



  • von singleton ableiten find ich immer ein wenig doof, besser ist es
    (meiner meinung nach)
    das singlton-pattern in die class einzuweben

    mal ein beispiel für einen logger
    (frei aus dem kopf, nur um das prinzip zu zeigen)

    class logger
    {
    
    public :
    
    static logger * getInstance
     {
     if(m_instance == 0)
      {
      m_instance = new Logger();
      }
     return m_instance;
     }
    
    private :
     // Konstruktion verbieten
     logger();
    
     static logger * m_instance;
    };
    

    dtor muss man natürlich noch schreiben usw.

    dann in der cpp noch m_instance mit 0 initialisieren und fertig.
    Damit darf es im gesamten Project nur eine einzige instance vom logger geben,
    auf die man so zugreift :

    logger::getInstance()->XXXXX;
    

    keine konstruktion nix ...



  • Ich verstehe das jetzt so, dass man in jeder Klasse in der man logger benötigt die dazugehörige logger.h Datei lädt, und darauf zugreift mit

    logger::getInstance()->XXXXX;
    

    anstatt dem üblichen

    loggerinstanz.XXXXX;
    

    Allerdings muss ich sagen, dass die obere Variante hässlich aussieht, und von Leuten mit meinen Vorkenntnisse nicht verstanden würde, mal abgesehen davon dass ich nicht verstehe wie man überhaupt eine Klasse nutzen kann ohne sie zu initialisieren, weil es jedem widerspricht was ich bislang über Klassen wusste.

    Matthias



  • Eine Klasse musst du nicht initialisieren, kannst du auch gar nicht, du kannst sie nur definieren. Eine Klasseninstanz muss initialisiert werden. Eine statische Methode, also Klassenmethode bzw. ein statisches Datenelement bezieht sich nicht auf eine bestimmte Instanz, sondern nur die Klasse selbst, dass heißt, du kannst sie überall dort verwenden, wo die Klasse an sich bekannt ist, und musst keine Instanz erzeugen. Das bedeutet aber auch, dass du keinen Zugriff auf eine Methode/Eigenschaft einer bestimmten Instanz hast. Im Grunde genommen sind statische Methoden ähnlich globalen Funktionen, nur dass sie eben nur im Kontext der jeweiligen Klasse existieren. Im Singleton Pattern dient die statische Methode dem Zweck, eine Instanz, und eben nur eine, der jeweiligen Klasse anzulegen, mit der dann gearbeitet wird...

    Grüße

    Martin



  • pospiech schrieb:

    Folgende Lösung scheint zu funktionieren, ich wüsste aber gerne eure Meinung dazu

    #pragma once
    #include "PI_C862Mercury.h"
    extern PI_C862Mercury Verschiebetisch;
    
    #include "StdAfx.h"
    #include "GlobalClasses.h"
    PI_C862Mercury Verschiebetisch;
    

    dann kann ich mit Laden von '#include "GlobalClasses.h"' in jeder Klasse auf die Instanz 'Verschiebetisch' zugreifen.

    Genau die Lösung hätte ich auch vorgeschlagen (ohne den MS-spezifischen Kram natürlich :p). Singleton ja oder nein muss man abwägen, besonders wenn es nicht kritisch ist, dass nur eine Instanz existiert.


Anmelden zum Antworten