Erstellen eines Arrays von Objektzeigern C ++

8

Ich möchte ein Array erstellen, das Zeiger auf viele Objekte enthält, aber ich weiß nicht im Voraus, wie viele Objekte ich halten werde, was bedeutet, dass ich Speicher dynamisch für das Array reservieren muss. Ich habe an den nächsten Code gedacht:

%Vor%

wobei ants als Ant **ants; und Ant als Klasse definiert ist.

Wird es funktionieren?

    
SIMEL 04.05.2011, 17:46
quelle

5 Antworten

16
  

Wird es funktionieren?

Ja.

Wenn möglich, sollten Sie jedoch einen Vektor verwenden:

%Vor%

Wenn Sie ein dynamisch zugewiesenes Array verwenden müssen, würde ich diese Syntax bevorzugen:

%Vor%

Aber vergiss das alles. Der Code ist immer noch nicht gut, da es manuelle Speicherverwaltung erfordert. Um das zu beheben, könntest du deinen Code ändern zu:

%Vor%

Und das Beste wäre einfach das:

%Vor%     
StackedCrooked 04.05.2011, 17:50
quelle
4
%Vor%     
Erik 04.05.2011 17:48
quelle
3

Müssen Sie wirklich Zeiger auf die Elemente halten? Wenn Sie Objekte nach Wert verwenden können, ist ein viel einfacherer Ansatz die Verwendung eines Vektors: std::vector<Ant> ants(num_ants); . Dann müssen Sie nicht nur Schleifen schreiben, sondern Sie müssen sich auch keine Gedanken über Speicherlecks von unformatierten Zeigern und anderen Objekten der Objektverwaltung machen.

Wenn Sie Objektzeiger benötigen, um eine API zu erfüllen, können Sie weiterhin vector für den äußeren Container verwenden und die Objekte manuell zuweisen.

%Vor%     
Mark B 04.05.2011 18:09
quelle
2
%Vor%

Oder wenn Sie nicht wissen, wie viele im Voraus:

%Vor%

Andererseits denke ich, dass Sie sich fragen müssen, ob Ant ist ein Entitätstyp oder ein Wert. Wenn es ein Wert ist, wirst du wahrscheinlich wollen Sie die Zeiger und die dynamische Zuordnung überspringen; Wenn es sich um einen Entitätstyp handelt, müssen Sie die Lebensdauer von betrachten das Objekt und wann und wo es gelöscht wird.

    
James Kanze 04.05.2011 17:54
quelle
2

Ja, das ist die allgemeine Idee. Es gibt jedoch Alternativen. Sind Sie sicher, dass Sie ein Array von Zeigern benötigen? Ein Array von Objekten der Klasse Ant kann ausreichend sein. Sie müssten nur das Array zuweisen:

%Vor%

Im Allgemeinen sollten Sie std::vector zur Verwendung eines Arrays verwenden. Ein Vektor kann nach Bedarf wachsen und übernimmt die Speicherverwaltung für Sie.

In dem von Ihnen geposteten Code müssten Sie jedes Element von ants in einer Schleife löschen und dann das Array selbst löschen, delete [] ant . Beachten Sie den Unterschied zwischen delete und delete [] .

Ein weiterer Punkt, da die Array-Indizes in C ++ 0-basiert sind, wird die folgende Konvention verwendet, um über die Elemente zu iterieren:

%Vor%

Dies macht Code viel lesbarer.

    
Dima 04.05.2011 17:56
quelle

Tags und Links