Selbsterzeugende Klasse, OOP für Dummies, Kapitel 23 ...



  • ... Seite 422, um es genau zu nehmen 😉
    Hmm, solte wohl doch eher
    'SichSelbstEinEinzigesMalInstanziierende' Klasse heißen.

    Hallo allerseits !

    Hier erst mal die Header-Datei, um die es geht:

    'Register.H':
    
    #ifndef _REGISTER_H
    #define _REGISTER_H
    
    #include "producer.h"
    
    class RegisterViews 
    {
    private:
    	// Jede neue View Klasse wird hier aufgenommen
       Producer<TextView>     m_producerTextView;
       Producer<GraphicsView> m_producerGraphicsView;
    
    	// Die Klasse ist nicht instanziierbar!
    	RegisterViews() 
    	{
          DocViewFactory::instance().registerProducer(typeid(TextDocument), 
                                                      &m_producerTextView);
          DocViewFactory::instance().registerProducer(typeid(GraphicsDocument), 
                                                      &m_producerGraphicsView);
    	}
    
       static RegisterViews m_OneInstance;
    };
    
    RegisterViews RegisterViews::m_OneInstance;
    
    #endif
    

    Im Buch steht dazu:
    'Da der Konstruktor von RegisterViews private ist, kann niemand außerhalb von RegisterViews ein Objekt dieser Klasse anlegen, das einzige RegisterViews-Objekt wird als statische Klassenvariable in RegisterViews selbst erzeugt.'

    Damit ist doch die Zeile ...

    static RegisterViews m_OneInstance;

    ... gemeint, welche dafür sorgt, dass beim ersten Eintrag von 'Register.H', also noch vor dem eigentlichen 'int main () {' Programmstart, die einzigste Instanz der Klasse RegisterViews erzeugt wird, und den Code des Konstruktors ausführt.

    Was genau bewirkt nun der Ausdruck ...

    RegisterViews RegisterViews::m_OneInstance;

    ... ?

    Er liegt doch außerhalb der Klasse RegisterViews,
    kann also mit deren Erzeugung nichts zu tun haben.

    Sorry Leute, ich verstehe es einfach nicht 🙂
    wer weiß Rat ?

    Thanx,
    meisterquitte



  • Der Ausdruck

    static RegisterViews m_OneInstance;
    

    (innerhalb der Klassendeklaration von RegisterViews) *deklariert* die Klassenvariable m_OneInstance. Hingegen *definiert* der Ausdruck

    RegisterViews RegisterViews::m_OneInstance;
    

    ebendiese Variable (vorzugsweise übrigens nicht in einem Header!). Will sagen: hier kommt sie ins Leben. Es ist also genau anders herum, als du es vermutest.

    Diese Implementierung eines Singeltons ist übrigens Mist. Aber sie steht ja auch in einem Buch.....

    Stefan.



  • Hallo,

    static-Variablen, muessen nochmal ausserhalb einer Klasse deklariert werden, um
    dise auch ggf. initialisieren zu koennen, was innerhalb der Klassen-
    deklaration nicht moeglich ist.

    mfg
    v R



  • DStefan schrieb:

    ...
    Diese Implementierung eines Singeltons ist übrigens Mist. Aber sie steht ja auch in einem Buch.....

    Stefan.

    Und jetzt lassen wir das geflame und schliessen am besten den Thread, sonst
    artet es hier wieder aus

    mfg
    v R



  • Mumpitz, der Thread bleib offen.


Anmelden zum Antworten