Instanzvariable nur deklarieren
-
Hallo,
ich habe im forum und bei google leider nichts passendes gefunden (bzw. falsch gesucht).ich möchte eine Klasse als Feld in eine andere einbauen. mein Problem ist nur, dass bei der deklaration gleich der constructor aufgerufen wird...darf er aber nicht, da ich dafür eine Variable benötige, welche ich dem Constructor der äußeren Klasse mitgebe.
Sinn soll sein, dass ich meine Merhfachvererbung auflösen will, da diverse Pointerspielereien mache, welche damit unverträglich sind

mal mein code (etwa aus dem Kopf getippt)
class A { public: A(int param); } class B { public: B(const char *text); } bisher: class C:public A,public B { public: C(int param,const char *text); } C::C(int param,const char *text) :A(param),B(text) { }nun will ich dass das ganze so aussieht:
class C:public B { public: A fA; C(int param,const char *text); } C::C(int param,const char *text) :B(text); { fA=A(param); }habe schon versucht es als pointervariable (*fA) zu deklarieren, hat aber auch nicht funktioniert.
ich hoffe, es kommt in etwa rüber, was ich erreichen will

ein stichwort über das ich fündig werde würde mir auch erstmal reichenGruß Frank
-
Stichwort: Initialisierungsliste
ähh ... hast Du ja schon, also:
C::C(int param,const char *text) :B(text), fA(param); { }
-
@Belli
Hast du seinen Code überhaupt angeschaut oder den Text gelesen?!@frank
Doch. Das geht schon über Zeiger. Dann brauchst du allerdings new für das dynamische Allokieren. Zusätzlich würde ich dir einen Smart Pointer empfehlen, damit du sonst das gleiche Verhalten hast, wie bei automatischen Objekten und du dich nicht um den Zeiger speziell kümmern musst (zerstörung).z.B
boost::scoped_ptrwürde sich da anbieten. Wenn du kein boost benutzt reicht hier auchstd::auto_ptr..Eine Möglichkeit wäre auch, dass A das kopieren und zuweisen implementiert, dann kannst du das auch so machen. Allerdings wird da dennoch bereits am Anfang ein Objekt erzeugt.
-
Jo, hab ich gelesen. Ich habe meinen Beitrag noch mal zur Verdeutlichung editiert. Habe ich etwas falsch verstanden?
-
@drakon
wie sähe eine sole deklaration in der header-Datei aus?
das new/delete stört mich eigentlich nicht ;), da ich das Object im constructor erzeuge und im destructor wieder freigebe@Belli
dein code basiert auf der Mehrfachvererbung, welche ich auflösen will
-
Ich denke, ich habe überhaupt nicht verstanden, was Du möchtest. In meinem Beispiel wird fA zur Konstruktionszeit von C mit dem an C übergebenen Parameter konstruiert.
Und Dein Beispiel:
C::C(int param,const char *text) :B(text); { fA=A(param); }habe ich so interpretiert, daß Du genau das wolltest, nur das in letzterem Beispiel Overhead durch Konstruktion eines temporären A und Zuweisung entsteht. Aber das Endergebnis ist doch mit dem identisch, was bei meinem Vorschlag herauskommt?!

Naja, egal, vielleicht kannst Du ja mit Drakons Tip mehr anfangen.
-
ich möchte die eine klasse aus meiner ursprünglichen Mehrfachvererbung in ein Memberfeld verwandeln (vielleicht so verständlich)
wenn ich dieses jedoch anlege, will er das Objekt jedoch gleich instanzieren und mecker über einen falschen Constructor, da ja ein Parameter fehlt.
mir geht hauptsächlich darum, wie muss die deklaration in der headerdatei aussehen
wenn ich drakon richtig verstehe, dann so:
class C:public B { public: A* fA; C(int param,const char *text); virtual ~C(); } C::C(int param,const char *text) :B(text); { fA=new A(param); } C::~C() { delete(fA); }müsste ich nochmal probieren, aber ich dachte, ich habs so probiert und trotz des pointer-sterns kam die meldung, dass der passende constructor von A [A()] fehlt.
-
frank schrieb:
ich möchte die eine klasse aus meiner ursprünglichen Mehrfachvererbung in ein Memberfeld verwandeln (vielleicht so verständlich)
Die Lösung von Belli tut genau das was du willst.
Möglicherweise ist ist ja das Semikolon auch im echten Code zu viel?
C::C(int param,const char *text) :B(text); // <- Da gehört kein ; hin { ...
-
Also das hier:
class A { public: A(int _i) : i(_i){} private: int i; }; class B { public: B(int param) : fA(param) {} private: A fA; }; int main() { B b(5); }ist nicht was Du willst? Eine Klasse B mit einem Member vom Typ Klasse A. Das kompiliert bei mir nämlich einwandfrei.