Variable nur ein einziges mal initialisieren?
-
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:
- Poste compilierbare Minimalbeispiele - reduziert auf das Nötigste.
- Poste die Meldungen Deines Compilers per copy 'n paste - nicht verfälschen. Zeilennummern angeben!
- Lies Smart Questions! Zweimal!
cheers, Swordfish
-
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