Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte vergleichen -> Singleton

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
08.07.2003, 21:36 Uhr
~wissender
Gast


Ich wage zu widersprechen!
Statics sind immer da, selbst wenn sie nicht konstruiert werden.
virtual hat Recht, dass nur bei args > 1, der Konstruktor aufgerufen wird und dort was auch immer getan wird, der Platz, welcher für die statische ("lokale")
Instanz gebraucht wird ist allerdings schon gleich zu Programmbeginn auf dem Heap, nicht auf dem Stack.
Insofern gibt es das Objekt schon, es wurde nur nicht der Konstruktor aufgerufen.
Es wird also KEINE Instanz erzeugt, sondern "nur" der Konstuktor aufgerufen.
Erzeugen einer Instanz beinhaltet meiner Meinung immer die Reservierung von Speicherplatz (Heap oder Stack) und genau dass findet hier eben nicht statt!

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
08.07.2003, 22:05 Uhr
virtual
Sexiest Bit alive
(Operator)


In der Regel spricht man von Instanziierung, wenn der Konstruktor einer Klasse aufgerufen wird und ein Objekt geboren wird. Ob der Speicher nun seit Stunden schon dem programm zugeordnet ist oder das betriebssystem einen Eingabedialog macht: "Bitte bau mal eine neue RAM bank ein, ich warte solange, bis du fertig bist!" ist aus C++ Sicht völlig egal.

Letzt endlich ist es eine Entscheidung des Betriebssystems, wann der Speicher zugeordnet wird. Er muß einfach da sein, wenn der Konstruktor aufgerufen wird.

Übrigens gibt des da auch noch das nette feature des Placement-news, welches die STL Allocatoren in der STL nutzen: Da kann man Objekte an einer bel. Speicherstelle konstruieren, ohne daß man Speicher belegt. Folgender Code erzeugt zwei Objekte von Klasse X, ohne daß jedesmal neuer Speicher belegt wird (sondern nur einmal):

C++:
class X
{
};
X* px = new X; // speicher belegen und instance erzeugen
px->~X(); // Instanze destruieren, speicher behalten
new(px) X; // keinen Speicher belegen, nur instance erzeugen
delete px; // nu is aber gut!


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.07.2003 um 22:16 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
09.07.2003, 09:43 Uhr
ao

(Operator)



Zitat:
virtual postete
In den meisten Fällen ist es - wie ao schon sagte - aber eher eine akademische Frage, wann das Singleton instantiiert wird, allerdings eben nur dann, wenn die Konstruktion der Instanz nicht irgendwelche bedeutsame Seiteneffekte hat.


... was sie nicht haben sollte. Der Konstruktor soll seine Instanz konstruieren und nichts weiter. Seiteneffekte haben da nichts verloren.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
09.07.2003, 12:16 Uhr
~0xdeadbeef
Gast


Es gibt schon Fälle, in denen der Konstruktor Nebeneffekte haben muss. Zum Beispiel ist Windows-COM so gestrickt, dass der Konstruktor einer Klasse, die ein COM-Interface beinhaltet, den Referenzcounter der Klasse, die hinter dem Interface steckt, hochzählt. Ähnliches gilt für Tracing/Debugging und statistische Erhebungen (wie oft eine Klasse instanziiert wurde etc).

Aber im Grunde hast du recht, die primäre Aufgabe eines Konstruktors ist es, die Member-Variablen zu initialisieren.

Übrigens - was Tracing angeht - schaut mal auf www.aspectc.org/ vorbei - das ist mal ne schöne Spracherweiterung...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
09.07.2003, 13:30 Uhr
ao

(Operator)



Zitat:
~0xdeadbeef postete
Aber im Grunde hast du recht, die primäre Aufgabe eines Konstruktors ist es, die Member-Variablen zu initialisieren.


... und alles andere zu tun, was erforderlich ist. Wenn es erforderlich ist, einen Referenzzähler zu erhöhen (->COM-Klasse), damit die Konstruktion komplett ist, dann gehört das in den Konstruktor. Wenn ein Dialogfenster registriert und auf den Bildschirm gebracht werden muß, auch das. Wenn irgendwelche Files angelegt, TCP-Verbindungen aufgebaut oder Festplatten formatiert werden müssen ( :-) ), auch das.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: