In meinem C++ - Code habe ich eine Klasse Object mit einem ID-Feld vom Typ Int ausgestattet. Jetzt möchte ich einen Zeigervektor vom Typ Objekt * erstellen. Zuerst versuchte ichErstellen von C++ - Vektor von Zeigern
vector<Object*> v;
for(int id=0; id<n; id++) {
Object ob = Object(id);
v.push_back(&ob);
}
aber dies scheiterte, weil hier die gleiche Adresse wiederholt sich nur n-mal. Wenn ich den neuen Operator verwenden würde, würde ich bekommen, was ich will, aber ich möchte dynamische Speicherzuweisung vermeiden. Dann dachte ich, dass ich n verschiedene Zeiger vor der for-Schleife deklariere. Einfache Möglichkeit dazu ist ein Array zu erklären, so dass ich dies tat:
vector<Object*> v;
Object ar[n];
for(int i=0; i<n; i++) {
ar[i] = Object(i);
}
for(int i=0; i<n; i++) {
v.push_back(ar+i);
}
Gibt es noch die Möglichkeit einen Speicherverlust zu bekommen, wenn ich es auf diese Weise tun? Auch eine Array-Deklaration zu durchlaufen ist meiner Meinung nach ein wenig ungeschickt. Gibt es andere Möglichkeiten, Vektorzeiger zu erstellen, aber manuelle Speicherverwaltung zu vermeiden?
EDIT: Warum will ich Zeiger statt nur einfache Objekte?
Nun habe ich die ursprüngliche Ist-Situation etwas modifiziert, weil ich dachte, auf diese Weise kann ich die Frage in der einfachsten möglichen Form darstellen. Jedenfalls denke ich immer noch, dass die Frage beantwortet werden kann, ohne zu wissen, warum ich einen Vektor von Zeigern möchte.
Eigentlich habe ich
Class A {
protected:
vector<Superobject*> vec;
...
};
Class B: public A {...};
Class Superobject {
protected:
int id;
...
}
Class Object: public Superobject {...}
In abgeleiteten Klasse B
ich das Mitglied Feld vec
mit Objekten des Typs Object
füllen möchten. Wenn die Oberklasse keine Zeiger verwendet, hätte ich Probleme mit dem Objekt-Slicing. Also in der Klasse B
Konstruktor möchte ich vec
als Vektor der Zeiger des Typs Object*
initialisieren.
EDIT2
Ja, so scheint es mir, dass die dynamische Zuordnung ist die vernünftige Option und die Idee, ein Array zu verwenden, eine schlechte Idee ist. Wenn das Array den Gültigkeitsbereich verlässt, werden die Dinge schief gehen, weil die Zeiger im Vektor auf Speicherstellen zeigen, die nicht notwendigerweise die Objekte mehr enthalten.
In Konstruktor für Klasse B hatte ich
B(int n) {
vector<Object*> vec;
Object ar[n];
for(int id=0; id<n; id++) {
ar[id] = Object(id);
}
for(int id=0; id<n; id++) {
v.push_back(ar+id);
}
}
Dieses in Objekten der Klasse B. sehr seltsames Verhalten verursacht
Wenn Sie keine dynamische Speicherzuweisung möchten, warum verwenden Sie Zeiger? Sie können auch mit einem Array von Object arbeiten. –
Warum möchten Sie Zeiger in erster Linie speichern? – Yuushi
Das Problem mit Ihrer zweiten Methode ist, dass es kein legales C++ ist. 'Objekt ar [n];' ist nicht zulässig, es sei denn, n ist eine Konstante. Auch da Sie gemäß Ihrer Bearbeitung eine Klassenhierarchie haben, aber mit 'Object ar [n];' haben Sie nur Objekte, keine Superobjects. Übrigens ist Ihre erste Methode auch falsch, weil Sie die Adressen von Objekten speichern, die zerstört wurden. Ich würde nur dynamische Speicherzuweisung verwenden. – john