Ist es möglich, erstellen Sie einen Vektor von Zeigern?
Nur gefragt, weil ein problem habe ich, ist es möglich, erstellen Sie einen Vektor von Zeigern? Und wenn ja, wie? Insbesondere im Zusammenhang mit Iteratoren und .begin (), ie: Wie würde ich das aktivieren dieser Vektor in einen Vektor von Zeigern:
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c>cvect
cvect.push_back(cobj);
vector<c>::iterator citer
for(citer=cvect.begin();citer<cvect.end();citer++)
{
citer->func();
}
InformationsquelleAutor | 2009-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher.
Dinge im Auge zu behalten:
Müssen Sie Aufräumen nach dem selbst wenn Sie dynamisch reservierten Speicher als ich in meinem Beispiel
z.B.:
Diese können vereinfacht werden, indem ein Vektor von
shared_ptr
s (wieboost::shared_ptr
). Versuchen Sie nicht, mitstd::auto_ptr
für diese, es wird nicht funktionieren (nicht selbst kompiliert).Andere Sache, zum im Verstand zu halten, sollten Sie vermeiden, mit
<
zu vergleichen Iteratoren in der Schleife, wenn möglich, es funktioniert nur für Iteratoren, Modell random-access-iterator, was bedeutet, dass Sie nicht ändern können aus Ihrem code zu verwenden, z.B. einestd::list
.InformationsquelleAutor Logan Capaldo
vector <c> cvect
ist nicht ein Vektor von Zeigern. Es ist ein vector von Objekten des Typs c. Sie möchtenvector <c*> cvect
. und das wollen Sie wahrscheinlich:Und dann, da ein iterator, Sie wollen so etwas wie:
Natürlich, es ist ziemlich wahrscheinlich, Sie wollte nicht, dass ein Vektor von Zeigern in den ersten Platz...
ah ja, guter Punkt
Und wenn push_back() wirft, werden Sie wahrscheinlich wollen, um zu vermeiden undicht die neue c.
InformationsquelleAutor
Ja, es ist möglich, und in der Tat ist es notwendig auf Zeiger verwenden, wenn Sie beabsichtigen, Ihre-Vektor enthalten Objekte aus einer gesamten Klassen-Hierarchie eher als von einem einzelnen Typ. (Fehlerhafte Nutzung von Zeigern führt das gefürchtete problem der object slicing -- alle Objekte sind still umgewandelt Basisklasse-Typ. Dies ist nicht diagnostiziert, indem der compiler, und ist fast sicher nicht das, was Sie wollen.)
Beachten Sie, dass mit einem Vektor von Zeigern, Sie brauchen, um machen Sie Ihr eigenes memory-management -, so sehr vorsichtig sein -- wenn Sie lokale Objekte (wie oben), müssen Sie nicht fallen aus dem Rahmen, bevor der container tut. Wenn Sie den Zeiger verwenden, um Objekte mit erstellt
new
müssen Siedelete
Sie Sie manuell, bevor der container zerstört wird. Sie sollten unbedingt berücksichtigen, die Verwendung von smart-Pointern in diesem Fall, wie diesmart_ptr
zur Verfügung gestellt vonBoost
.InformationsquelleAutor j_random_hacker
Ja, sicher.
Bitte beachten Sie die Erklärung der
vector<c*> cvect
und die Verwendung voncvect.push_back(&cobj)
.Vom code zur Verfügung gestellt, Sie sind mit iterator in einen falschen Weg. Zugriff auf die member ein iterator verweist, die Sie verwenden müssen
*citer
stattciter
allein.InformationsquelleAutor Gant
Haben Sie erstellen
vector<c*>
für einen Vektor von Zeigern. Dann nutzen Sienew
um den Speicher für c-Objekte und schieben Sie Sie in Vektor. Auch, vergessen Sie nicht, dass Siedelete
sich selbst und Vektor.clear() wird nicht loslassen des Speichers, der für c-Objekte. Sie haben zum speichern von c als Vektor von Zeigern sonst hier der Aufruf der virtuellen Funktion wird nicht funktionieren.InformationsquelleAutor Naveen
Versuchen Boost-Zeiger-Container-Bibliothek. Es hat mehrere Vorteile gegenüber normalen Vektor von Zeigern, wie:
InformationsquelleAutor