Effizientes Anlegen vieler gleicher Objekte
-
Hi,
ich habe in einem Projekt folgendes Problem:
Es existiert eine Basisklassem vom Typ MainNode:
MainNode *BaseNode = new MainNode;Unterhalb dieser Basisklasse sollen 16 Objekte vom Typ ChildNode angelegt werden, MainNode besitzt eine Methode add(), mit der ich diese Unterknoten hinzufügen kann.
Bisher gehe ich so vor:
ChildNode *Child_1 = new ChildNode; BaseNode->add(Child_1); ChildNode *Child_2 = new ChildNode; BaseNode->add(Child2);Bei 16 Knoten ist das vom Aufwand her zu vertreten, bei meinetwegen 160 Knoten wird es nervig. Leider fällt mir keine Lösung ein, wie ich das ganze etwas schöner gestalten könnte, um diesen Prozess nicht mit so viel Tipparbeit zu verbinden. Ich bin mir aber sicher, dass das irgendwie gehen muss- habt Ihr da ein Paar Tipps oder Hinweise?
-
Indem du z.B. eine Schleife verwendest:
const int ELEMENTS = 160; for(int i=0; i<ELEMENTS; ++i) BaseNode->add(new ChildNode());
-
An so was ähnliches hatte ich auch schon gedacht-
nur bei einer Konstruktion wie:
BaseNode->add(new ChildNode())bekomme ich immer noch keinen Pointer auf einen spezifischen ChildNode. Deswegen ja überhaupt das Theater mit der Durchnummerierung der VChild Nodes.
-
Was macht denn add? Das fügt die Dinger doch sicherlich zu einem Vektor oder soetwas hinzu, wozu also spezifische Zeiger?!
-
Wenn du durchnumerierte Variablen vom Typ ChildNode willst, benutz doch einen vector:
std::vector<ChildNode*> v(ELEMENTS); // ELEMENTS: s.o. for(int i=0; i<ELEMENTS; ++i) { v[i]=new ChildNode(); BaseNode->add(v[i]); }Oder du implementierst die Liste mit einem vector , fügst das Element bei Add immer mit push an den vector an und überlädst für die Klasse den operator[] um einen Indexzugriff auf die Elemente zu ermöglichen, dann musst du nicht ein extra vector wie bei mir immer mit rumschleppen.
-
Weil die darüberliegende Programmbibliothek vorschreibt, dass es eben Zeiger vom Typ ChildNode sein müssen. Wenn ich einfach per
new ChildNode()Speicherblöcke reserviere, diese an BaseNode übergebe und dann immer per getChild(01) oder so etwas anfordere, funktioniert möglicherweise das Ganze Systemnicht mehr.
-
Nee, das handelt sich um eine Szenengrafenverwaltung, die nicht mehr funktioiniert, wenn ich meine Objekte in STL Container Packe...
-
Dann könntest du ja noch eine Struktur basteln die etwa so aussieht:
struct IndexChild { int index; ChildNode *child; }In MainNode legst du einen Zähler an und dann änderst du Add etwa so ab:
void MainNode::Add(ChildNode *cn) { IndexChild ic; ic.index = zaehler++; ic.child = cn; // Element der Liste hinzufügen }Wenn das auch nicht möglich ist (warum auch immer), dann wird wohl nur deine erste Möglichkeit funktionieren.
-
Du sollst ja auch nicht die Objekte in einen Container legen, sondern die Zeiger darauf. Das interessiert die Szenengraphenverwaltung nicht im geringesten, solange du die Zeiger nicht versehentlich löschst.
-
okay, das hilft. Danke!