Variable nur ein einziges mal initialisieren?



  • Ja das hab ich mir auch gedacht doch der Compiler meldet mir eine Fehlermeldung. Die genannte Variable ist in wirklichkeit ein Objekt einer weiteren Klasse die ich gebastelt hab (vergessen zu sagen^^). Also will ich nur das Objekt einmal für alle haben, gleichzeitig will ich es nur ungern global machen oder aus der Privat-Sektion nehmen.



  • http://de.wikipedia.org/wiki/Singleton_Pattern

    über Vor- und Nachteile möge man sich streiten



  • Horaz schrieb:

    Ja das hab ich mir auch gedacht doch der Compiler meldet mir eine Fehlermeldung.

    ... die Du natürlich aus Datenschutzgründen für Dich behalten musst. 🙄

    Horaz schrieb:

    Die genannte Variable ist in wirklichkeit ein Objekt einer weiteren Klasse die ich gebastelt hab (vergessen zu sagen^^).

    Ok, zeig' mal.

    Horaz schrieb:

    Also will ich nur das Objekt einmal für alle haben, gleichzeitig will ich es nur ungern global machen oder aus der Privat-Sektion nehmen.

    Was heißt für alle? Überall im Programm zugänglich und nicht wirklich globel? ➡ Singleton.
    Ist das Objekt konstant?

    cheers, Swordfish



  • Was heißt für alle? Überall im Programm zugänglich und nicht wirklich globel? ➡ Singleton.
    Ist das Objekt konstant?

    Ich meinte die Klasse mit dem Objekt, nicht das Objekt. Das Objekt soll nur für die Klasse sein und für keinen anderen. Es dürfen mehrere Objekte der Klasse erzeugt werden, doch alle sollen das gleiche Objekt benutzen. Jetzt klarer?
    PS: Singleton ist nicht das was ich suche.



  • mh denke du kannst das echt nur über global machen

    ich weis nicht wie static genau arbeitet ansonsten würde ich ein static cosnt objekt machen (geht doch von der syntax oder?)

    also entweder über static cosnt versuchen doer ein globales constentes objekt nutzen

    aber das globale ist unschön und du willst es nicht wie du ja sagtest



  • Ich versteh au nicht warum er mir einen Fehler schickt.

    obj\Release\main.o:main.cpp:(.text+0x1dc1): undefined reference to Exception::m_element' obj\\Release\\main.o:main.cpp:(.text$\_ZN9ExceptionC1EPKcRKiS1\_[Exception::Exception(char const*, int const&, char const*)]+0x11c): undefined reference toException::m_element'

    Das ist der Fehler!

    Vielleicht muss ich mir au einfach eine andere Lösung überlegen.



  • Horaz schrieb:

    Ich versteh au nicht warum er mir einen Fehler schickt.

    obj\Release\main.o:main.cpp:(.text+0x1dc1): undefined reference to Exception::m_element' obj\\Release\\main.o:main.cpp:(.text$\_ZN9ExceptionC1EPKcRKiS1\_[Exception::Exception(char const*, int const&, char const*)]+0x11c): undefined reference toException::m_element'

    Das ist der Fehler!

    Vielleicht muss ich mir au einfach eine andere Lösung überlegen.

    Hast Du die Definition vergessen?



  • Das IST die Definition^^



  • Horaz schrieb:

    Das IST die Definition^^

    Ich meine die def. der statischen variable wie es swordfish richtig gemacht hat.
    Welche def. meinst Du?
    Simon



  • Horaz schrieb:

    Es dürfen mehrere Objekte der Klasse erzeugt werden, doch alle sollen das gleiche Objekt benutzen. Jetzt klarer?

    Ich denke auch, du meinst static . Statische Klassenvariablen existieren nur einmal pro Klasse, die Instanzen teilen sich die Variable also. Solche Variablen müssen ausserhalb der Klasse definiert werden:

    class MyClass
    {
        static float Var;       // Deklaration
    };
    
    float MyClass::Var;         // nur Definition
    float MyClass::Var = 3.2f;  // Definition + Initialisierung
    

    @ Skym0sh0: Wenn du dich nicht damit auskennst, lass die Antwort lieber, sonst verwirrst du den Threadersteller nur (ist nicht böse gemeint). Global ist echt keine gute Möglichkeit, und mit const hat das wenig zu tun.



  • jetzt mal spass beiseite

    ein bisschen code wäre echt hilfreich...



  • Horaz schrieb:

    Das Objekt soll nur für die Klasse sein und für keinen anderen.

    Das erreicht man mit private.

    Es dürfen mehrere Objekte der Klasse erzeugt werden, doch alle sollen das gleiche Objekt benutzen.

    Das erreicht man mit static.

    Jetzt klarer?

    Naja, hängt davon ab.

    Ich fass mal soweit zusammen was man dir bisher mühsam aus der Nase ziehen konnte:

    - Du hast eine Klasse (nennen wir sie mal K), die ein Member hat, das nur einmal für alle Objekte der Klasse K vorhanden sein soll. Nennen wir dieses Member mal mem .
    - mem ist ein Objekt einer weiteren Klasse, nennen wir sie mal MemClass.
    - das Objekt (vermutlich mem?) soll nur für die Klasse (vermutlich K) zugänglich sein.
    - Es dürfen mehrere Objekte der Klasse (ich denk mal K) erzeugt werden.

    Zusammengefasst heißt das: K ist eine ganz normale Klasse, mem ist vom Typ MemClass, mem ist private (=> nur für K zugänglich) und static (=> ein Objekt für alle K's). Aussehen tut das wie schon vorgeschlagen wurde:

    class MemClass {
      /* ... */
    };
    
    class K {
    private:
      static MemClass mem;
    };
    
    MemClass K::mem(/*Konstruktorargumente für mem*/);
    

    Was man noch weiß: du hast an sowas auch schon gedacht (lobesam) und versucht (noch besser), bekommst aber eine Fehlermeldung (nicht so schön).
    Was man aber leider nicht weiß ist das wichtigste: WIE hast dus versucht und welche Fehlermeldung bekommst du?

    Die nächsten Schritte: poste einen reduzierten Codeausschnitt, der nur das enthält was für das Verständnis deines Ansatzes nötig ist, gefolgt von der Fehlermeldung des Compilers. Danach sehn wir weiter.



  • pumuckl@offline hat mein Problem richtig dargestellt.
    Die Fehlermeldung hab ich geschickt.
    Nexus Idee ist genau das was ich suche(thx Nexus damit klappts).

    Neue Frage:

    Aber zuerst eine kurze erläuterung:

    class Exception //Meine Klasse
    {
        private:
            struct Error //Dieses Struct wird an den Template der Klasse Element übergeben
            {
            }
            Element <Error> m_element; //Mein Objekt
    };
    
    Element <Error> Exception::m_element; //Fehler
    

    Der Fehler kommt weil die struct Error in der Private-Sektion ist und damit nicht "sichtbar".

    Meine neue Frage gibt es einen Weg den Struct in der Private-Sektion zu lassen?



  • Horaz schrieb:

    Der Fehler kommt weil die struct Error in der Private-Sektion ist und damit nicht "sichtbar".

    Falsch geraten... Das ist ein Fehler, weil Error im globalen Namespace nicht definiert ist.

    template< typename T >
    class Element
    {
    	private:
    		T foobar;
    };
    
    class Exception
    {
    	private:
    		struct Error
    		{
    		};	// ; fehlt.
    
    		static Element< Error > m_element; // static!
    };
    
    Element< Exception::Error > Exception::m_element; // Error mit voll qualifiziertem Namen angeben!
    

    Vor Deinem nächsten Post - zu diesem oder anderen Themen - tu mir bitte drei Gefallen:

    1. Poste compilierbare Minimalbeispiele - reduziert auf das Nötigste.
    2. Poste die Meldungen Deines Compilers per copy 'n paste - nicht verfälschen. Zeilennummern angeben!
    3. Lies Smart Questions! Zweimal!

    cheers, Swordfish


  • Mod

    Horaz schrieb:

    Der Fehler kommt weil die struct Error in der Private-Sektion ist und damit nicht "sichtbar".

    Nein. Zugriffsregeln beeinflussen die Sichtbarkeit eines Namens nicht. Und würdest du die konkrete Fehlermeldung zeigen, wäre das noch deutlicher zu demonstrieren. Noch einmal: wenn du Fehler in diesem Forum erwähnst, zitiere sie bitte direkt. Keine Umschreibungen o.ä.
    Error ist an der Stelle nicht sichtbar, weil es im Scope der Klasse definiert wurde und es keinen Grund gibt, diesen Scope an der Stelle zu durchsuchen.

    Element <Exception::Error> Exception::m_element;
    


  • @camper: Nachplapperer 😃 SCNR - Das wollt' ich immer schon mal zu Dir sagen. 😉

    cheers, Swordfish



  • Des wollt ich doch damit sagen. Weil des in der Private-Sektion ist es ausserhalb des Sichtbarkeitsbereich für die Variable.

    BTW: Jetzt geht alles thx mein Problem ist gelöst



  • Horaz schrieb:

    Des wollt ich doch damit sagen. Weil des in der Private-Sektion ist es ausserhalb des Sichtbarkeitsbereich für die Variable.

    Nein. Das hat nichts mit Zugriffsspezifizierern zu tun.

    cheers, Swordfish


Anmelden zum Antworten