OOP: Objekte als Member
-
Hallo zusammen,
ich möchte eine Klasse schreiben, die als Instanzvariable ein Objekt ohne Default-Konstruktor hat. In der Literatur habe ich leider als Beispiel dafür nur Klassen gefunden, die Grundtypen (heisst das auch in C++ so), also int verwenden. Hier ein bisschen Code zum verdeutlichen:
Class1 ist irgendeine Klasse ohne Default-Konstruktur, aber mit einem Konstruktor, der zwei Strings erwartet. Die Header-Datei Class2.h einer Beispiel-Klasse Class2 lautet:
class Class2 { public: Class2(); protected: Class1 class1; };
Die Klasse Class2 als Class2.cpp:
Class2::Class2() { class1("foo", "bar"); }
Class1 (in etwa):
class Class1 { public: Class1(std::string, std::string); };
Nun meckert g++ (zurecht):
error: no matching function for call to ´Class1::Class1()`
womit er ja recht hat. Ich möchte aber gar nicht, dass er dort schon ein Objekt der Klasse Class1 erzeugt, sondern das soll beispielsweise erst im Konstruktor passieren. Mein Ziel ist in der gesamten Klasse unter der Referenz 'class1' etwas verfügbar zu haben. Dazu muss ich es ja irgendwie auf klassenweit deklarieren.
Wie kann ich das lösen?
Danke im voraus
-
maveric schrieb:
Wie kann ich das lösen?
Class2::Class2() : class1("foo", "bar") { }
-
class Class2 { public: Class2(); protected: static Class1 class1("foo", "bar"); };
-
@Chew-Z: Prima, danke, genau das habe ich gesucht.
@finix: Danke für die Antwort. Aber damit greifen ja dann alle Instanzen auf ein und dasselbe class1 zu, ich wollte class1 als Instanzvariable, also eine Instanz von Class1 pro Instanz von Class2 quasi.
-
maveric schrieb:
@Chew-Z: Prima, danke, genau das habe ich gesucht.
@finix: Danke für die Antwort. Aber damit greifen ja dann alle Instanzen auf ein und dasselbe class1 zu, ich wollte class1 als Instanzvariable, also eine Instanz von Class1 pro Instanz von Class2 quasi.
Halt stop, genau umgekehrt ist es richtig. Meine Lösung liefert ein und dieselbe
Instanz für alle Class2-Objekte.
Aber genau danach hattest du doch gefragt.
-
Ich habe mich in meinen Formulierungen verstrickt: Du hast vollkommen recht und ich habe mich falsch ausgedrückt.
Ich wollte genau das Gegenteil einer static member, ich glaube die korrekte Bezeichnung dafür in OOP ist Instanzvariable. Eine static member glaube ich nennt man Klassenvariable. Ich wollte class1 als eine Instanzvariable von Class2.
Das Problem habe ich gelöst, indem ich class1 innerhalb von Class2 wie in meinm ersten Code-Listing deklariert habe, aber mit Hilfe der Initialisierungsliste initialisiert habe (wie von finix vorgeschlagen).