Zuweisung Dieser Art von Anfänger Frage, aber ich habe nicht C++ in einer langen Zeit getan, so hier geht ...dynamisch ein Array von Objekten
Ich habe eine Klasse, die eine dynamisch zugewiesene Array enthält, sagen
class A
{
int* myArray;
A()
{
myArray = 0;
}
A(int size)
{
myArray = new int[size];
}
~A()
{
// Note that as per MikeB's helpful style critique, no need to check against 0.
delete [] myArray;
}
}
Aber jetzt möchte ich ein dynamisch zugeordnetes Array dieser Klassen erstellen. Hier ist mein aktueller Code:
A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i)
{
arrayOfAs[i] = A(3);
}
Aber das explodiert schrecklich. Da das neue Objekt A
erstellt (mit dem A(3)
Aufruf) zerstört wird, wenn die for
Schleife Iteration abgeschlossen ist, und dies bedeutet, dass die interne myArray
dieser A
Instanz delete []
-ed wird.
Also ich denke, meine Syntax muss schrecklich falsch sein? Ich denke, es gibt ein paar Fixes, die wie Overkill scheinen, die ich vermeiden möchte:
A
.vector<int>
und vector<A>
so muss ich mich nicht um all dies kümmern.arrayOfAs
ein Array von A
Objekte zu sein, muss es ein Array von A*
Zeigern sein.Ich würde denken, das ist nur ein Anfänger Sache, wo es eine Syntax gibt, die tatsächlich funktioniert, wenn versucht wird, eine Reihe von Dingen dynamisch zuzuweisen, die interne dynamische Zuordnung haben.
(Auch Stil Kritik geschätzt, da es schon eine Weile her, seit ich C++ tat.)
Update für zukünftige Zuschauer: Alle Antworten unten sind wirklich hilfreich. Martins wird wegen des Beispielcodes und der nützlichen "Regel von 4" akzeptiert, aber ich empfehle wirklich, sie alle zu lesen. Einige sind gute, prägnante Aussagen darüber, was falsch ist, und einige weisen richtig darauf hin, wie und warum vector
s ein guter Weg sind.
Die beste Antwort! Upvoted! Ich wünschte nur, ich könnte das wieder auffrischen! –
Haben Sie Artikel zu den Ausnahmen, auf die Sie sich beziehen? – shoosh
Warum kapitalisieren Sie "roh"? Sicher, es ist keine Abkürzung für irgendetwas, sondern bedeutet einfach "roh" wie in unmodified, plain, nicht ein Smart-Pointer oder eine andere Art von Wrapper. – jalf