Iterator



  • #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
      class Singleton
      {
        private:
          //Konstruktor private, damit man sich keine Instanzen holen kann.
          Singleton();
          //Den Kopierkonstruktor schützen um zu vermeiden, dass das Objekt unbeabsichtigt kopiert wird.
          Singleton(const Singleton& cc);
    
        public:
          ~Singleton();
          static Singleton& getInstance();
      };
    
      Singleton& Singleton::getInstance()
      {
        static Singleton instance;
        return instance;
      };
    
    int main()
    {
    
    Singleton x.getInstance();   // geht nicht :(
    
    }
    

    Wie kann ich überhaupt eine Instanz von Singleton anlegen ?

    So funktionierts jedenfalls nicht.



  • Singletone* s = Singletone::getInstance()
    

    1 Sekunde Schneller 🙂

    Aber ist meine Lösung mit Singletone* grundlegend falsch 😮 ?



  • Zum Beispiel so:

    Singleton& x=Singleton::getInstance();
    


  • Falls die Referenz global ist, musst du noch aufpassen, dass sie rechtzeitig initialisiert wird. Ich hatte mal genau dieses Problem und als Folge statt einer Referenz ein Makro verwendet.

    Blackskyliner schrieb:

    Aber ist meine Lösung mit Singletone* grundlegend falsch 😮 ?

    In diesem Fall schon, da eine Referenz und kein Zeiger zurückgegeben wird.



  • Um noch die Frage nebenbei zu stellen. Ist der Singletone angenehmer wenn es bloß eine Referenz ist oder aber ist der Pointer-Weg (So wie ich ihn bei meinem Singletone nutze) auch "legetim", im Sinne von sinnvoll oder sollte ich lieber mit Referenzen arbeiten, von wegen Geschwindigkeit, Sicherheit, etc.?



  • Blackskyliner schrieb:

    Singletone* s = Singletone::getInstance()
    

    Aber ist meine Lösung mit Singletone* grundlegend falsch 😮 ?

    Wenn Du Zeiger lieber hast, kannst Du auch Zeiger nehmen.

    Singletone* s = &Singletone::getInstance();
    


  • Blackskyliner schrieb:

    Um noch die Frage nebenbei zu stellen. Ist der Singletone angenehmer wenn es bloß eine Referenz ist oder aber ist der Pointer-Weg (So wie ich ihn bei meinem Singletone nutze) auch "legetim", im Sinne von sinnvoll oder sollte ich lieber mit Referenzen arbeiten, von wegen Geschwindigkeit, Sicherheit, etc.?

    Alle Wege führen von Rom weg.
    Bei Singletons hat Du enorme Freiheit, es zu machen, wie Du magst. Der Meyers-Singleton paßt schon verdammt oft. Aber sei flexibel. Wie wir hören dürfen, weicht man manchmal sogar auf Makros aus.



  • Singleton* x=Singleton::getInstance();
    

    Fehlermeldung:

    Fehler 1 error C2440: 'Initialisierung': 'Singleton' kann nicht in 'Singleton *' konvertiert werden

    wo wird eigentlich geprüft dass nicht mehr als eine Instanz angelegt wurde ?



  • Wie schon 1-2 Posts nach meinem geklärt, hatte ich mich etwas vertan und statt einem Pointer * muss nur eine Referenz & des Variablentyps genutzt werden. 🙂 Hatte nicht darauf geachtet, das dein getInstance() ja den Typt Singleton& zurück gibt 🙂

    Dann sollte der Fehler auch weg sein.

    Also:

    Singleton& s = Singleton::getInstance();
    


  • blurry333 schrieb:

    wo wird eigentlich geprüft dass nicht mehr als eine Instanz angelegt wurde ?

    Vom static.



  • int main() 
    { 
    Singleton s = Singleton::getInstance();
    }
    

    Fehlermeldung:

    Fehler 1 error C2248: "Singleton::Singleton": Kein Zugriff auf private Member, dessen Deklaration in der Singleton-Klasse erfolgte.



  • da fehtl ja auch nen &



  • trotzdem gehts net.

    Dann kommt ein Linker fehler

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""private: __thiscall Singleton::Singleton(void)" (??0Singleton@@AAE@XZ)" in Funktion ""public: static class Singleton & __cdecl Singleton::getInstance(void)" (?getInstance@Singleton@@SAAAV1@XZ)". pause.obj



  • Warum geht das dann..

    #include <iostream> 
    #include <stdio.h> 
    
    using namespace std; 
    
    int& funk(int& x)
    {
    	return x;
    }
    
    int main()
    {
         int p=7;
    	int zahl;
    
        zahl=funk(p);  // obwohl zahl keine Referenz 
    	               // funktionierts
    
    }
    


  • 1. wieso gehts hier eigtl um singeltons statt iteratoren?

    2. nachdenken 4tw...

    struct Singleton
    {
    private:
    
    public:
      Singleton& get_instance()
      {
        static Singleton instance;
        return instance;
      }
    };
    
    int main()
    {
      Singleton& s = Sinlgeton::get_instance();
    }
    

    Bis hierhin ist noch alles klar, richtig?
    Jetzt müssen wir allerdings noch dafür sorgen, dass nirgendwo ein anderes Singleton-Objekt erstellt werden kann
    Wir müssen also die KOnstruktoren(copy und standard) private machen.
    Allerdings müssen wir den standard-CTor auch implementieren, weil wir ihn selbst ja benutzen - und das hast du offensichtlich nicht getan.

    bb

    PS:
    #include <stdio.h> der Header heißt schon seit 11 Jahren cstdio



  • Der Linkerfehler kommt dadurch, dass du den Contructor und Destruktor,wie auch den Copykontruktor keinen leeren Body gibst, bzw. ihn nicht implementierst, womit diese vom Linker nicht gefunden werden.

    Ergo das hier fehlt:

    #include <iostream> 
    #include <cstdio> 
    
    using namespace std; 
    
    class Singleton 
    { 
    	private: 
    		//Konstruktor private, damit man sich keine Instanzen holen kann. 
    		Singleton();
    		//Den Kopierkonstruktor schützen um zu vermeiden, dass das Objekt unbeabsichtigt kopiert wird. 
    		Singleton(const Singleton& cc);
    
    	public: 
    		~Singleton();
    		static Singleton& getInstance(); 
    }; 
    
    Singleton& Singleton::getInstance() 
    { 
    	static Singleton instance; 
    	return instance; 
    }
    
    Singleton::Singleton(){}
    Singleton::~Singleton(){}
    Singleton::Singleton(const Singleton& cc){}
    
    int main() 
    { 
    
    	Singleton& s = Singleton::getInstance();   
    
    }
    


  • jo jetzt gehts.

    warum brauch ich im main unbedingt die Referenz.

    Singleton x=Singleton::getInstance(); // geht nicht
    
    Singleton& x=Singleton::getInstance(); // geht
    

    Ok klar ist wenns keine Referenz wär könnte man mehr als ein objekt anlegen.
    Aber in meinem obigen Bespiel gings ja auch ohne .



  • Blackskyliner schrieb:

    Ergo das hier fehlt:

    Singleton::Singleton(const Singleton& cc){}
    

    Nein, das hier wird nicht implementiert.



  • blurry333 schrieb:

    jo jetzt gehts.

    warum brauch ich im main unbedingt die Referenz.

    Singleton x=Singleton::getInstance(); // geht nicht
    
    Singleton& x=Singleton::getInstance(); // geht
    

    weil du ein singleton _nicht_ kopieren oder zuweisen kannst.

    ps: immernoch diese drecks spam-sperre -.-



  • Huch, da wahr ich wohl etwas zu übereifrig mit implementieren 🙂
    Aber ist es nicht eigentlich egal, wenn man den copy private setzt?
    Ist es insofern unerwünscht, damit man IN der Singleton nicht versehentlich kopiert?


Anmelden zum Antworten