PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Klasse in Klasse Zugriff


del_4901
2006-01-29, 06:55:33
Also zuerst wollte ich soetwas hier bauen:

class A
{
public:
void* y;
A(){}

class B
{
public:
void* getZ(){return (y);}
}b;
};

Aber da kannte er y nicht ;(
Also zur Variante2:


class A
{
void* y;

class B
{
void* z;
B(void* z){this.z=z;}
}b(y);
};

... mhm sch.. gleiches Prob.
Variante 3:

class A
{
void* y;
A(){b.setZ(y);}

class B
{
public:
void* z;
void setZ(void* zi){z=zi;}
}b;
};


Die geht, ist aber umständlich zu handhaben.


Ich will doch blos in B auf die Adresse y zugreifen können, am besten ohne das ich noch nen extra Pointer brauch zum zwischenspeichern, und ohne lästigen "Set'er".
Die Adresse wird sich nach dem ausprägen auch nicht mehr ändern. Aber jedes Obj. hat seine Eigene. "static void* y" und "A::y" helfen mir da nicht wirklich.

Einer ne Idee? vllt. den Linker irgendwie zur Zusammenarbeit zwingen? "externen"???

zeckensack
2006-01-29, 09:03:43
class A
{
void* y;
A(void* y):y(y),b(y) {}

class B
{
public:
B(void* z) {this->z=z; }
void* z;
}b;
};
Einer ne Idee? vllt. den Linker irgendwie zur Zusammenarbeit zwingen? "externen"???Dein Klassendesign grundlegend überdenken. Was du da vorhast ist mit Verlaub Blödsinn. Oder unglücklich beschrieben. Jedenfalls sehe ich da nur unnötige Komplexität, und keinen besonderen Sinn.

Was du brauchst ist im Optimalfall garkein B. Jedwede Methode die du in B gerne hättest, kannst du auch vollkommen schmerzfrei gleich in A hineinsetzen und B weglassen.

Wenn du gerne "für die Optik" gewisse Member weiter einkapseln möchtest, dann nimm ein struct, und initialisiere die Felder im Konstruktor von A.

del_4901
2006-01-29, 09:36:56
[CODE]class A
Wenn du gerne "für die Optik" gewisse Member weiter einkapseln möchtest, dann nimm ein struct, und initialisiere die Felder im Konstruktor von A.
Geht wohl nicht anders. Naja wenistens nur einmalige Schreibarbeit.
Natürlich alles nur für die Optik, wir Programierer sind doch alle schreibfaul. ^^