Konstruktor mit initialisierungsliste

hallo.

habe hier das problem, daß ich eine referenz auf eine klasse A als parameter für klasse B übergeben muß.

jetzt ist es aber so, daß nicht alle instanzen von B diese referenz auf A brauchen.
also hab ich mir gedacht, kein problem: mach ich einfach zwei konstruktoren mit unterschiedlichen parameterlisten.

haut aber nicht hin, weil der compiler im „abgespeckten“ konstruktor trotzdem das „reference member“ (das ja in der klassendefinition als private existiert) initialisiert haben will.

das ganze sieht momentan so aus:

namespace namensraum
{
 class klasse
 {
 public:
 klasse(namensraum::refklasse& ref,
 unsigned char x);

 klasse(unsigned char x);

 ~klasse(void);

 private:
 namensraum::refklasse& \_ref;
 unsigned char \_x;
 };
}

wie komm ich da raus?

danke & gruß

michael

Hossa :smile:

In C++ wird mit einer Referenz ein anderer Name für ein Objekt vereinbart. Daher muss eine C+±Referenz immer initialisiert werden! Die Referenz kann auch nicht mehr geändert werden, sie bleibt mit dem Objekt verknüpft, das bei der Initialisierung angegeben wurde. Ein Versuch, die Referenz zu ändern führt nur dazu, dass das Objekt, für das die Referenz ja als anderer Name verwendet wird, geändert wird.

int a, b;
int &c; //falsch, weil nicht initalisiert!
int &c=a; //ok, c kann nun als anderer Name für a verwendet werden
c=b; //Die Referenz c bezieht sich weiterhin auf a, der Wert b wird a zugewiesen.

Bei deinem Problem gibt es also keinen Ausweg. Du kannst vielleicht die Referenz durch einen Pointer ersetzen. Da weiß ich aber nicht, wie das in deine Klassen-Struktur passt…

Viele Grüße

Hasenfuß

Hallo,
setze doch einfach die Referenz mit einem Dummy. Wenn Du besonders sorgfältig sein willst, dann nimm eine abgeleitete Klasse, die Fehlermeldungen schmeißt, wenn irrtümlich Methoden aus dem Dummy aufgerufen werden. Dann müssen natürlich alle relevanten Funktionen in der ursprünglichen Klasse virtual sein.

namespace namensraum
{
 class refklasse {
 virtual methode(...);
 ....
 };
 class refDummy : refklasse {
 virtual methode(...) {
 // schmeißt Fehlermeldung 
 ....
 }
 } dummy;

 class klasse
 {
 public:
 klasse(unsigned char x,
 namensraum::refklasse& ref = dummy);
 ~klasse(void);
 private:
 namensraum::refklasse& \_ref;
 unsigned char \_x;
 };
}

Hallo,
setze doch einfach die Referenz mit einem Dummy.

ist zwar nicht besonders schön, aber ich hab’s jetzt so gemacht.

danke & gruß

michael