Initialisierungsliste - mit Arrays
-
hi!
Eine meiner Klassen soll für sich selbst 6 Unterklassen Erstellen.
Und das würde ich gerne um ein New zu vermeiden, in der Initialisierungsliste machen.ich weiß nur nicht wie.
Hexapod :: Hexapod(CData* cdata) : m_bein[0](4.0f, 0.0f, 5.0f, -45.0f, cdata, 0), m_bein[1](4.0f, 0.0f, 5.0f, -45.0f, cdata, 0) {
Das ist der nicht funktionierende naive Ansatz...
Aber wie geht es nun?
-
Eine meiner Klassen soll für sich selbst 6 Unterklassen Erstellen.
Du meinst offensichtlich eher, eine deiner Klassen hält als Membervariable Sechs andere Klassen. Oder willst du diese Sechs Klassen als Basisklassen haben?
(Erstellen suggeriert, dass du pernew
dynamisch welche erzeugst)Hexapod :: Hexapod(CData* cdata) : m_bein[0](4.0f, 0.0f, 5.0f, -45.0f, cdata, 0), m_bein[1](4.0f, 0.0f, 5.0f, -45.0f, cdata, 0) {
Ich habe leider keine Ahnung, was das sein soll? Versuchst du, die Sechs Klassen in einem Array namens
m_bein
zu halten?
In dem Fall böte sich list-initialization an:Hexapod :: Hexapod(CData* cdata) : m_bein{ {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, ... }
-
cl90 schrieb:
hi!
Eine meiner Klassen soll für sich selbst 6 Unterklassen Erstellen.
Und das würde ich gerne um ein New zu vermeiden, in der Initialisierungsliste machen.Diese Aussage macht keinen Sinn.
Möglichkeiten um ein Array zu initialisieren:class foo { int array[5]; public: // Alle Felder mit dem gleichen Wert, Var 1: foo() { for (int i = 0; i < 5; ++i) array[i] = 0; } // Alle Felder mit dem gleichen Wert, Var 2: foo() : array{ 0 } {} // Verschiedene Werte, Var 1: foo() { array[0] = 0; array[1] = 1; ... } // Verschiedene Werte, Var 2: foo() : array{ 1, 2, 3, 4, 5} {} };
Die Variante 2 erfordert C++11.
In deinem Fall schreibst du anstatt 0, 1, ... eher DeinArrayTyp(4.0f, 0.f, 5.f, -45.f, cdata, 0).
Und wieso denkst du brauchst du new dafür?
-
Ich hatte es vorher mit new.
Aber ich würde gerne darauf verzichten.So sieht es jetzt aus:
Hexapod :: Hexapod(CData* cdata) { m_bein[0] = new leg(4.0f, 0.0f, 5.0f, -45.0f, cdata, 0); m_bein[1] = new leg(6.0f, 0.0f, 0.0f, 0.0f, cdata, 1); m_bein[2] = new leg(4.0f, 0.0f, -5.0f, 45.0f, cdata, 2); m_bein[3] = new leg(-4.0f, 0.0f, 5.0f, -135.0f, cdata, 3); m_bein[4] = new leg(-6.0f, 0.0f, 0.0f, 180.0f, data, 4); m_bein[5] = new leg(-4.0f, 0.0f, -5.0f, 135.0f, data, 5); }
Wie kann man das Ohne new machen?
-
Statt einem Array von Zeigern machst du erst einmal ein Array von Klassenobjekten.
-
ja.. aber dann:
'leg': Kein geeigneter Standardkonstruktor verfügbar
-
Solution 1:
Du gibst der Klasse einen Default Konstruktor und schreibst dann so etwas wie:array[0] = Object(5, 4, 3, adjlfj, "dflajds");
Solution 2:
Du arbeitest mit C++11 und nimmst das Konstrukt mit {}.
-
Sone schrieb:
In dem Fall böte sich list-initialization an:
Hexapod :: Hexapod(CData* cdata) : m_bein{ {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, ... }
Was ist damit, geht das nicht? Freut mich ja fast, dass auch die Postings anderer Leute ignoriert werden
Achso, falls C++98 und kein Default-Konstruktor in leg vorhanden:
std::vector<leg> m_bein; ... Hexapod::Hexapod(CData* cdata) { m_bein.push_back(leg(4.0f, 0.0f, 5.0f, -45.0f, cdata, 0)); // für alle 6 Beine }
btw: "bein" und "leg" im selben Programm?
-
Bashar schrieb:
Sone schrieb:
In dem Fall böte sich list-initialization an:
Hexapod :: Hexapod(CData* cdata) : m_bein{ {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, {4.0f, 0.0f, 5.0f, -45.0f, cdata, 0}, ... }
Was ist damit, geht das nicht?
Nein geht nicht.
sobald " : m_bein" kommt erwartet er sofort eine Klammer: "("Bashar schrieb:
std::vector<leg> m_bein; ... Hexapod::Hexapod(CData* cdata) { m_bein.push_back(leg(4.0f, 0.0f, 5.0f, -45.0f, cdata, 0)); // für alle 6 Beine }
Ich weiß, müsste eigentlich so funktionieren. Wirft bei mir aber an anderen stellen seltsame fehler auf, denen ich gerade auf den Grund gehe...
-
Welchen Compiler nutzt du? Falls gcc/clang, versuch Ersteres und übergib dem Compiler "-std=c++0x".