2010-11-24 14 views
3

Ich möchte eine Reihe von Objekten einer Klasse erstellen, aber diese Nummer wird nicht bekannt sein, bis zur Laufzeit. Intuition sagt mir, dass ich die folgende Schleife verwenden, sollte meine Objekte zu erstellen:Können Sie Objekte mit Variablen in C++ erstellen

for (int count = 0; count < no_of_objects; count ++) 
{ 
    ClassName object_name[count] 
} 

Dies funktioniert jedoch nicht, wie der Compiler nicht zu mögen scheint Variablen als Objektnamen verwenden. Gibt es eine Möglichkeit, diese Objekte mit einer Schleife zu erstellen, oder muss ich eine andere Methode verwenden?

Bitte beachten Sie, dass ich C++ nicht lange benutzt habe und erst vor kurzem in die Programmierung eingeführt wurde, so dass meine Kenntnisse der Sprache etwas begrenzt sind - bis jetzt ist das Array die einzige Datenstruktur, die ich gelernt habe - keine Vektoren usw.

Antwort

6

Es ist Zeit verwenden Vektoren lernen:

std::vector<ClassName> objects (no_of_objects); 

Verwenden Sie nun Objekte [0] bis Objekte [no_of_objects - 1]; Beachten Sie, dass objects.size() gleich no_of_objects ist. Wenn Sie fertig sind, schauen Sie sich die Methoden des Vektors an, aber für den Moment reicht es, wenn Sie wissen, dass der Header (< vector>) enthalten ist, um Objekte als dynamisches Array zu verwenden.

+2

+1 für C++ Lösung – fredoverflow

+0

@Fred, während ich zustimme, Vektoren sollten im Allgemeinen in einer Situation wie dieser verwendet werden, da dies Hausaufgaben getaggt ist, Vektoren möglicherweise nicht erlaubt. Das könnte die nächste Klassenaufgabe sein :) – pstrjds

+0

@pstrjds: Es ist getaggt [Hausaufgaben], nicht [Vektoren-nicht-erlaubt]. Chris sagte, dass er Vektoren noch nicht kennt, nicht dass er sie nicht benutzen kann. In Ermangelung dieser letzteren Einschränkung antworte ich, um die grundlegende Vektornutzung zu lernen (die von allen zwei obigen Sätzen abgedeckt wird). –

0

Wenn Ihre Klasse einen Standardkonstruktor hat (und Sie die Instanzen standardmäßig konstruieren möchten), können Sie ein Array new verwenden, dh new ClassName[some_number] - das vom Typ ClassName* ist.

Wenn es keinen Standardkonstruktor hat, können Sie mit der Platzierung new herumspielen, oder verwenden Sie ein Array von Zeigern und new jedes manuell.

0

den Speicher zuweisen dynamisch Sie das new Stichwort

ClassName = new object_name[count]; 

und stellen Sie sicher, den Speicher nach dem delaocate unter Verwendung delete Stichwort

+0

Sie wollen 'ClassName * pObjects =' und 'delete []', obwohl. –

2

In C++ müssen Sie dies dynamisch zuweisen, wenn Sie die Anzahl der Objekte bis zur Laufzeit nicht kennen. Sie würden Code ähnlich wie diese benötigen:

ClassName* pmyClasses = new ClassName[no_of_objects]; 

Dies wird ein Array zuweisen Ihre Klassenobjekte zu halten, müssen Sie sie dann initialisieren.

for (int i=0; i < no_of_objects; i++) 
{ 
    pmyClasses[i] = new ClassName(); 
} 

Sie können sie dann über das Array Indexer zugreifen:

for (int i=0; i < no_of_objects; i++) 
{ 
    pmyClasses[i].SomeFunction(); 
} 

Eine wichtige Sache zu beachten ist hier, dass, wenn Sie new verwenden Speicher zuweisen, dann müssen Sie delete verwenden, um es freizugeben. Da dies eine Array-Deklaration ist, müssen Sie den Operator delete [] verwenden.

class UsingMyClass 
{ 
    private: 
     ClassName* pmyClasses; 

    public: 
     UsingMyClass(int no_of_objects) 
     { 
      pmyClasses = new ClassName[no_of_objects]; 
      for (int i=0; i < no_of_objects; i++) 
      { 
       pmyClasses[i] = new ClassName(); 
      } 
     } 

     ~UsingMyClass() 
     { 
      for (int i=0; i < no_of_objects; i++) 
      { 
       delete pmyClasses[i]; 
      } 

      delete [] pmyClasses; 
     } 
} 

Dadurch wird, wenn das UsingMyClass Objekt geht aus -umfang: das Löschen im Destruktor der Klasse zu haben

for (int i=0; i < no_of_objects; i++) 
{ 
    delete pmyClasses[i]; 
} 
delete [] pmyClasses; 

Wenn Sie diese innerhalb oder eine Klasse verwenden, es wäre wichtig (Angenommen, es wurde nicht über einen Aufruf an new oder malloc erstellt), dann wird das Array von ClassName-Objekten bereinigt.

Verwandte Themen