🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #256

Re: F: Darf man das?

#256
From: Heiko Zschernitz
Date: Tue, 15 Aug 1995 21:22
85 lines
2720 bytes
In <5ruTxMFqwPB@0otter.link-goe.zerberus.de> H.OTTERSTEDT@LINK-GOE.zerberus.de (Heiner Otterstedt) writes:
>eine Frage: Darf ich in C++ eine Funktion einer Klasse
>aufrufen, bevor ihr Construktor aufgerufen wurde?

>class A
>{
>public:
>  A();
>}

>class B
>{
>public:
>  B(){};
>  TuWas() { printf("Ich tue jetzt was!"); }
>}

>A a;
>B b;

>A::A()
>{ b.TuWas();
>}

Sollte eigentlich keine Probleme geben, solange B::TuWas() auf keine
Elemente von b zugreift. Dann koenntest Du aber auch explizit angeben,
dass B::TuWas() eine statische Funktion ist:

class B
{
public:
   B(){};
   static TuWas() { printf("Ich tue jetzt was!"); }
};

Dann beschwert sich der Compiler, wenn B::TuWas() versehentlich doch auf
Elemente der Klasse zugreift.
Ausserdem koenntest Du dann den Aufruf der Funktion ein wenig umformulieren:

A::A()
{ B::TuWas();
}

Jetzt wird deutlich, dass der TuWas-Aufruf nichts mit dem Objekt b zu tun
hat (auf die darin enthaltenen Daten wird ja nicht zugegriffen).

Was anderes ist es, wenn B::TuWas() tatsaechlich an den Daten von b
herummanipuliert, wie in dem folgenden Beispiel. Dann darf TuWas()
natuerlich nicht statisch sein:

class B
{
   int x;
public:
   B(){};
   TuWas() { x = 1; }
};

A a;
B b;

A::A()
{ b.TuWas();
}

Das sollte meiner Meinung nach aber ebenfalls funktionieren, weil das
Objekt b statisch erzeugt wird. Dann ist der Speicher ja bereits vorhanden
und die Adresse bekannt, wenn b.TuWas() aufgerufen wird.

Uebrigens sollte man sich nicht darauf verlassen, dass die Konstruktoren
von a und b in dieser Reihenfolge aufgerufen werden. Je nach verwendetem
Compiler/Linker kann die Reihenfolge der Initialisierung von statischen
Objekten variieren (vermute ich). Und einige Compiler sind ueberhaupt nicht
in der Lage statische Objekte zu initialisieren. :-(

Da faellt mir gerade auf, dass vielleicht stdout noch nicht initialisiert
ist, wenn der Konstruktor von a aufgerufen wird?! Dann wuerde das printf
natuerlich nicht funktionieren...
(Halte ich aber fuer unwahrscheinlich.)

-- 
     o   GCS/O -d+(?) H++ s-:++ g+ p2 !au a- w+ C++++(---)$ N++   \|/
  _ /<_        W--- po- t++@ R+(+++) b+ e+ h+ n+(----) y+         0 0
_(_)>(_)____________________________________________________/-oOo--v--oOo-\_
Heiko Zschernitz - Bremen - Germany                    hz@andurg.hb.north.de
Technical Details
Message-ID: <ipTMwAmIBh107h@andurg.hb.north.de>
Path: arc1-ca.pugleaf.net!andurg.hb.north.de!hz
References: <5ruTxMFqwPB@0otter.link-goe.zerberus.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!andurg.hb.north.de!hz
From: hz@andurg.hb.north.de (Heiko Zschernitz)
Newsgroups: de.comp.lang.c++
Subject: Re: F: Darf man das?
Message-ID: <ipTMwAmIBh107h@andurg.hb.north.de>
Date: Tue, 15 Aug 95 23:22:58 +0200
References: <5ruTxMFqwPB@0otter.link-goe.zerberus.de>
Organization: The Tower of Andurg