Frage

Ich bin ein wenig verwirrt über ein Array von Objekten in C ++ Handhabung, da ich keine Informationen über finden scheinen, wie sie herumgereicht werden (Referenz- oder Wert) und wie sie in einem Array gespeichert werden.

Ich würde erwarten, ein Array von Objekten ein Array von Zeigern auf diesen Objekttyp sein, aber ich habe festgestellt, nicht diese geschrieben überall. Würden sie Zeiger sein, oder würden sich die Objekte im Speicher werden in einer Reihe gelegt?

Im Beispiel unten, eine benutzerdefinierte Klasse myClass hält einen String (würden diese macht es variabler Größe, oder ist das String-Objekt hält, einen Zeiger auf einen String und damit eine konsistente Menge Platz in Anspruch nehmen. Ich versuche, ein erstellen dynamische Anordnung von myClass Objekte innerhalb einer MyContainer. im myContainer.addObject () Methode, die ich versuchen, ein größeres Array zu machen, mit einem neuen Objekt alle Objekte in es kopieren entlang, dann die alte löschen. ich bin nicht zuversichtlich dass ich Reinigung mein Gedächtnis richtig mit meinem Destruktoren up - welche Verbesserungen konnte ich in diesem Bereich machen

class myClass
{
    private:
          string myName;
          unsigned short myAmount;

    public:
        myClass(string name, unsigned short amount)
        {
            myName = name;
        myAmount = amount;
        }

    //Do I need a destructor here? I don't think so because I don't do any
    // dynamic memory allocation within this class
};



class myContainer
{
    int numObjects;
    myClass * myObjects;

   public:
    myContainer()
    {
        numObjects = 0;
    }   

    ~myContainer()
    {
        //Is this sufficient?
        //Or do I need to iterate through myObjects and delete each
        // individually?
        delete [] myObjects;
    }


    void addObject(string name, unsigned short amount)
    {
        myClass newObject = new myClass(name, amount);

        myClass * tempObjects;
        tempObjects = new myClass[numObjects+1];
        for (int i=0; i<numObjects; i++)
            tempObjects[i] = myObjects[i]);
        tempObjects[numObjects] = newObject;
        numObjects++;
        delete newObject;

        //Will this delete all my objects? I think it won't.
        //I'm just trying to delete the old array, and have the new array hold
        // all the objects plus the new object.
        delete [] myObjects;
        myObjects = tempObjects;
    }
};
War es hilfreich?

Lösung

Ein Array in C ++ ist eine Anordnung von Objekten im Speicher angelegt. So zum Beispiel in:

struct pair {
   int x; int y;
};
...
pair array[10];

Jedes Element im Array wird mit einer Größe von zwei ints sein. Wenn Sie ein Array von Zeigern möchten, können Sie einfach eine deklarieren:

pair* array_of_pointers[10];

Die String-Objekte haben Zeiger auf die variable Größe Teil der Zeichenfolge. So sind sie sicher. In der Tat sind sie die wichtige Lektion hier. Die gleiche Weise verwenden Sie die String-Klasse zu übermäßigen Speicher zu vermeiden Umgang Sie den Vektor-Klasse verwenden, können alle die Probleme der Handhabung eines dynamischen Arrays zu vermeiden.

Für den Fall, tun Sie dies als eine Übung. Hier sind ein paar Probleme: newObject muss lokal zugeordnet werden, ohne new. Dadurch wird der Code richtig machen (als newObject kein Zeiger ist und new gibt einen Zeiger) und werden Sie auch explizit Umgang mit Speicher die Mühe sparen. (Auf einer fortgeschritteneren Note, macht dies den Code Ausnahme sicher an einem Standort) myObject wird nie initialisiert. Und Sie verwenden Initialisierung keine Listen in den Konstruktor. Der Konstruktor sollte wie folgt aussehen:

myContainer() : numObjects(0), myObjects(NULL)
{

}  

Die Destruktoren im Code sind genau so, wie sie sein sollten.

Andere Tipps

Nein, ein dynamisches Array kein Array von Zeigern auf diese Art - es ist ein Zeiger auf das erste Element. Die Elemente sind aufeinanderfolgend angelegt im Speicher und werden zerstört, wenn das Array delete[]ed wird.

So kann Ihr Deallokation sieht gut aus - Sie erstellen dynamische Arrays von myClass Objekte, so dass Sie sie nicht einzeln müssen delete. Sie würden dies nur tun, wenn Sie ein Array von Zeigern auf (dynamisch zugewiesen) haben Objekte.

Es gibt zwei definitive Fehler aber:

tempObjects[numObjects] = newObject; // assign a myClass pointer to a myClass instance?

Dies sollte z.

tempObjects[numObjects] = myClass(name, amount);

Auch wird myObjects nie initialisiert, das heißt, es enthält Müll und dereferencing / Verwendung zu undefinierten Verhalten führt.

Schließlich, wenn Sie dies tun zu Lernzwecken konzipiert, verwenden Sie einfach Container wie std::vector die bereits für Sie die ganze Arbeit machen.

würde ich ein Array von Objekten erwartet ein Array von Zeigern auf diesen Objekttyp sein, aber ich habe festgestellt, nicht diese geschrieben überall. Würden sie Zeiger sein, oder würden sich die Objekte im Speicher werden in einer Reihe gelegt?

Das Array besteht aus den Objekten selbst. Wenn Sie einen Array von Zeigern haben wollen, müssen Sie das erklären müssen:

myClass ** tempObjects;  
tempObjects = new myClass*[numObjects+1];  

Ich nehme an, Sie zu C # oder Java verwendet? In diesen Sprachen können Objekte nur auf Heap zugewiesen werden und werden immer von verwiesen abgerufen. Es ist möglich, in C ++, aber in C ++ können Sie auch Objekte direkt auf dem Stapel gelegt oder direkt ein Array-Konstrukt der Objekte selbst.

Im Beispiel unten, hält eine benutzerdefinierte Klasse myClass eine Zeichenfolge (würden diese macht es variabler Größe, oder ist das String-Objekt hält, einen Zeiger auf einen String und damit eine konsistente Menge Platz in Anspruch nehmen?

Nummer zwei: Das String-Objekt selbst ist konstant in der Größe, sondern hat einen Zeiger auf einen dynamischen angepassten Puffer aus dem Heap zugewiesen

.

Ich denke, die Aufhebung der Zuordnung sieht gut aus. Der Code könnte auf verschiedene Weise geschrieben effizienter gestaltet werden, aber es sieht richtig.

Versuchen Sie es zu testen, um zu sehen, was passiert, (ja, das kann Compiler-spezifisch sein, aber immer noch) ... Sie könnten versuchen, einen benutzerdefinierten Destruktor myClass hinzuzufügen (auch wenn Sie eine nicht brauchen), dass Schritte ein „global“ Zähler, wenn du aufgerufen, dann wird den Zähler drucken, nachdem das Array zu löschen.

Ich würde erwarten, dass der destructor jeden Objekt aufgerufen werden. Beachten Sie, dass sehr oft Objekte gespeichert werden „by-Zeiger“ für vererbte Objekte zu ermöglichen, setzt in das Array (Vermeidung von „Slicing“) wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top