Initialisieren eines Objekt-Arrays mit einem Parameter im Konstruktor als Instanzvariable
-
Servus,
folgendes Problem. Ich habe eine Klasse foo mit einem Konstruktor der einen Parameter entgegen nimmt. Dann habe ich eine Klasse bar die eine Instanzvariable vom typ foo hat. Folglich muss das dann so aussehen:
class foo { private: int m_val; public: foo(int val) { m_val = val; } int GetVal() const { return m_val; } }; class bar { private: foo m_foo; public: bar() : m_foo(255) { } foo GetFoo() const { return m_foo; } };
Das hier
private: foo m_foo(20);
geht ja nicht, deshalb muss das ja so aussehen:
public: bar() : m_foo(0) { }
So weit so gut. Wie sieht aber die Initialisierung aus, wenn meine private Instanzvariable ein Array aus foo-Objekten ist:
private: foo m_foo_arr[2];
Wie bekomme ich das im Konstruktor von bar initialisiert? Sorry, wenn's diese Frage schon gab, aber ich hab keine Idee wonach ich mit Google suchen soll.
Danke!
Gruß
dieter
-
bar() : m_foo[0](0), m_foo[1](0) { }
-
Hallo,
danke, aber das hatte ich selber auch schon probiert. Mein C++-Builder sagt daraufhin:
[C++ Fehler] Unit1.cpp(33): E2276 ( erwartet
[C++ Fehler] Unit1.cpp(33): E2444 Element 'bar::m_foo' wurde mehr als einmal initialisiert
[C++ Fehler] Unit1.cpp(33): E2276 ( erwartet
[C++ Fehler] Unit1.cpp(33): E2279 Standardkonstruktor zur Initialisierung des Elements 'bar::m_foo' nicht gefunden
[C++ Fehler] Unit1.cpp(35): E2034 Konvertierung von 'const foo *' nach 'foo' nicht möglichMinGW kompiliert das auch nicht.
Gruß
klaus-dieter
-
ein objektfeld kann nur mit einem standardkonstruktor hergestellt werden.
-
Hallo,
danke. Also bleibt mir nichts weiter übrig als es folgendermaßen zu lösen?
class foo { private: int m_val; public: foo() { m_val = 0; }; foo(int val) { m_val = val; } void SetVal(int val) { m_val = val; } int GetVal() const { return m_val; } }; class bar { private: foo m_foo_arr[2]; public: bar() { m_foo_arr[0].SetVal(200); m_foo_arr[1].SetVal(300); } foo GetFoo(int idx) const { return m_foo_arr[idx]; } };
Naja, dann muss es wohl so sein. Nochmals schönen Dank.
Gruß
klaus-dieter
-
frage dazu:
ich habe auch ein array von objekten, sagen wir KlasseA ObjektA[10]. neben dem standard-konstruktor gibts noch einen mit einem parameter. kann ich die einzelnen elemente des array dann einfach mit ObjektA[X]=KlasseA(Y); setzen?
-
Ja, kannst du.
@klaus-dieter
Warum benutzt du nicht die Initialisierungsliste in deinen ctor's (nicht auf dein Array Problem bezogen)?
-
groovemaster schrieb:
Ja, kannst du.
ja gut, aber was passiert im hintergrund? wird quasi ein temporäres Objekt angelegt und gleich nach dem kopieren wieder gelöscht? wäre wohl ein ziemlicher overhead?
übrigens ist der thread schon recht alt, wer weiss, ob es diesen "klaus dieter" überhaupt noch gibt
-
maximAL schrieb:
ja gut, aber was passiert im hintergrund? wird quasi ein temporäres Objekt angelegt und gleich nach dem kopieren wieder gelöscht? wäre wohl ein ziemlicher overhead?
jep, du hast da ein temporäres objekt, ist aber imho an sich nur zu vermeiden, wenn du ein array von pointern machst, imho würde dann der etwas geringere speed des heaps und die aufgabe des deallokieren des speichers die ganze sache wieder unschön machen