PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ & Singletons?



7.e.Q
22-04-2005, 08:32
Hallo,

ich bin auf der Suche nach guten deutschen Tutorials über die Verwendung und Implementierung von Singletons in C++ unter Linux. Auch die Erweiterung solcher mit Funktionen.

Gruß,
Hendrik

dra
22-04-2005, 08:44
http://de.wikipedia.org/wiki/Einzelst%C3%BCck_%28Entwurfsmuster%29

Meinste sowas? Das Minibeispiel ist zwar in java geschrieben, aber in C++ geht's fast äquivalent.

Auf jeden Fall musst du:

- constructor/destructor private definieren
- das Erstellen und Zerstören des Singleton-Objekts ermöglichen

Eine andere Möglichkeit wäre, static members zu benutzen, aber dann ist es schon kein Objekt mehr an dem du arbeitest (sprich, der this-Pointer ist nicht vorhanden).

Hoffe, geholfen zu haben!

Gruß,
dra

Boron
22-04-2005, 08:53
Wenn du dich für Entwurfsmuster interessierst, dann füht praktisch kein Weg an diesem Buch vorbeit:

Gamma, Helm, Johnson, Vlissides: Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software, Addison-Wesley, 2001

Wer wirklich "objektorientiert" programmieren will, und nicht nur ein paar Objekte durch den Hauptspeicher schubsen möchte, für den ist das Buch Gold wert.

Alle vorgestellten Muster werden in C++ vorgestellt. Einige wenige zusätzlich in Smalltalk.
Die Diagramme sind zwar nicht in UML, aber in der sehr ähnlichen Vorgängersprache OMT.

dra
22-04-2005, 09:36
Gamma, Helm, Johnson, Vlissides: Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software, Addison-Wesley, 2001

Soger verhältnismäßig aktuell. Wäre für mich auch mal ne Überlegung wert. Ist das Buch im Original auf Englisch?

Gruß,
dra

Boron
22-04-2005, 09:51
Ja, Original ist auf Englisch.
Aber die deutsche Übersetzung ist sehr gut.

Im Gegensatz zu vielen anderen Büchern, wo das Original deutlich besser ist, kann hier die Übersetzung locker mithalten.
Ich besitze die Deutsche Version, habe aber die englische auch schon angeschaut. Außer der Sprache sind da keine Unterschiede. Umfang und Verständlichkeit sind identisch.

Wer also kein nicht sooooo fit in Englisch ist kann bedenkelos zur deutschen Version greifen.

peschmae
22-04-2005, 18:28
Soger verhältnismäßig aktuell.

Aktuell - naja, das Original ist von 1998. Aber eine Überlegung ists sicher wert (ich habs nicht gelesen geschweige denn durchgearbeitet. Sollte ich wohl mal ;))

MfG Peschmä

dra
23-04-2005, 01:14
Ja, Original ist auf Englisch.
Aber die deutsche Übersetzung ist sehr gut.

Im Gegensatz zu vielen anderen Büchern, wo das Original deutlich besser ist, kann hier die Übersetzung locker mithalten.
Ich besitze die Deutsche Version, habe aber die englische auch schon angeschaut. Außer der Sprache sind da keine Unterschiede. Umfang und Verständlichkeit sind identisch.

Wer also kein nicht sooooo fit in Englisch ist kann bedenkelos zur deutschen Version greifen.

Gut, Englisch ist sowas wie meine zweite Muttersprache, und meine gesamte Fachliteratur ist ohnehin auf Englisch. Sollte also kein Problem sein. ;)

Gruß,
dra

hpf
26-04-2005, 20:40
hiho
also, ich hab das buch in english, es ist das buch über design patterns schlecht hin, ich kann es absolut vorbehaltslos empfelen(würde es sogar als pflichtlektüre bezeichnen).

mfg hpf

dra
26-04-2005, 21:30
*notier*

Cheers,
dra

7.e.Q
09-05-2005, 10:33
Ich werd mir das Buch auch mal einverleiben.

Es ging mir darum, Objekte zu erstellen, von denen im Programm nur eine einzige Instanz erlaubt ist, welche darüber hinaus aber von überall innerhalb des Programms zugreifbar ist. Also ein globales Objekt sozusagen. Dafür ist das Design-Pattern Singletons wohl am ehesten geeignet, bzw. deckt diese Problematik vollständig ab.

Ich danke euch für die Literatur Hinweise!

Gruß,
Hendrik

oracle2025
09-05-2005, 19:46
Ein echter "Singleton" ist meist überflüssig
Ich mach das so:



Timeline* g_timeline;

Timeline::Timline()
{
g_timeline = this;
}


und im Header:



extern Timeline* g_timeline;

7.e.Q
11-05-2005, 10:07
Ich hab das jetzt bei mir überall so gemacht:

Constructor und Destructor überall private, eine public static Function namens getInstance, die folgendermaßen aussieht:




static CObject& getInstance()
{
static CObject Instance;
return Instance;
}



Und überall, wo ich die Instance brauche, hol ich sie mir:




CObject* pObject = &CObject::getInstance();



So kann ich in meinem kompletten Programm mit der einen einzigen Instanz arbeiten, als sei sie global deklariert. Sehr praktisch. :)

oracle2025
13-05-2005, 15:06
So kann ich in meinem kompletten Programm mit der einen einzigen Instanz arbeiten, als sei sie global deklariert. Sehr praktisch. :)

Ich weiß, ich war auch ganz begeistert wie ich Singletons in C++ entdeckt hat, inzwischen kommt es mir aber trotzdem vernünftiger vor das so zu machen wie ichs vorher erklärt habe. Besonders dann, wenn man die Singleton-Klasse ständig braucht.

Es schaut halt IMHO schon etwas unübersichtlicher aus wenn überall im Code das:


CObject::getInstance().doThisAndThat()

anstatt dem steht:


g_cObject->doThisAndThat()

7.e.Q
17-05-2005, 08:41
Darum gebe ich jedem Objekt, in dem ich die Instanz von dem Singleton brauche, auch immer einen Zeiger auf eine solche Instanz mit, welche im Constructor grundsätzlich erstmal mit dem von getInstance() gelieferten Zeiger initialisiert wird. So steht mir die Instanz trotz Vermeidung globaler Variablen immer in den gewünschten Objekten zur Verfügung. :)

Singletons sind echt fett. :D

locus vivendi
17-05-2005, 09:10
Ein echter "Singleton" ist meist überflüssig
Ich mach das so:


Code:
Timeline* g_timeline;

Timeline::Timline()
{
g_timeline = this;
}


und im Header:


Code:
extern Timeline* g_timeline;
Das funktioniert aber nur eingeschränkt. Sicher, nachdem main aufgerufen wurde, kann man g_timeline dann dereferenzieren. Davor aber unter Umständen nicht, aufgrund der nicht vorhanden Rangfolge der Initialisierung von globalen Objekten zwischen verschiedenen Übersetzungseinheiten.

7.e.Q
17-05-2005, 12:03
Es wird aber beim ersten Aufruf von getInstance sofort eine Instanz angelegt, sofern noch keine vorhanden ist. Somit ist es im Prinzip egal, von wo man die Funktion das erste Mal aufruft. Der erste Aufrufer erhält sofort eine gültige Instanz, mit der auch alle nachfolgenden Aufrufer arbeiten. Und wenn die Instanz initialisiert werden soll, dann macht man das am besten tatsächlich in der Main, bzw. im Konstruktor des Singletons, falls man Standard-Werte unabhängig von anderen Objekten nutzen will.

Oder?

locus vivendi
17-05-2005, 13:39
Es wird aber beim ersten Aufruf von getInstance sofort eine Instanz angelegt, sofern noch keine vorhanden ist. Somit ist es im Prinzip egal, von wo man die Funktion das erste Mal aufruft. Der erste Aufrufer erhält sofort eine gültige Instanz, mit der auch alle nachfolgenden Aufrufer arbeiten. Und wenn die Instanz initialisiert werden soll, dann macht man das am besten tatsächlich in der Main, bzw. im Konstruktor des Singletons, falls man Standard-Werte unabhängig von anderen Objekten nutzen will.

Oder?
Moment, in meiner Anwort ging es um den Code von oracle2025, nicht um deinen. Deiner ist, zumindest soweit ich das sehe, vollkommen in Ordnung.

7.e.Q
17-05-2005, 13:51
Achso... okay... :D