dynamische Arrays



  • Hallo zusammen,

    ich habe folgende Klass Konto:

    class Konto {
    
          private:
                  int Kontonummer;
                  };
    

    Dazu erzeuge ich dynamisch 10 Objekte in einem Array:

    Konto *k1 = new Konto [10];
    

    Geht das auch anders, also in der Art von:

    Konto *k1 [10];
    
        k1 = new Konto();
    

    ==> So klappt es aber nicht, es erscheint eine Fehlermeldung. Wisst ihr hier noch einen Weg?

    Wie läuft denn hier das löschen ab?
    Mit delete k1 kann ich ja das komplette Array wieder löschen. Aber geht das auch für jedes Element des Arrays, oder nur komplett?

    Danke!

    Viele Grüße



  • Hier mal eine kleine Liste:

    //Einzelnes Konto:
    Konto* ZeigerAufEinzelnesKonto = new Konto;
    //Zugreiffen
    ZeigerAufEinzelnesKonto->Funktion();
    //Einzelnes Konto löschen:
    delete ZeigerAufEinzelnesKonto;
    
    //Mehrere Konten:
    Konto* ZeigerAufMehrereKonten = new Konto[10];
    //Zugreiffen
    ZeigerAufMehrereKonten[3].Funktion();
    //Mehrere Konten löschen:
    delete[] ZeigerAufMehrereKonten ;
    


  • Und bevor du dich unnötig damit herumplagst, schau dir mal die std::vector<> an.

    Mario22 schrieb:

    Geht das auch anders, also in der Art von:

    Konto *k1 [10];
        
        k1 = new Konto();
    

    ==> So klappt es aber nicht, es erscheint eine Fehlermeldung. Wisst ihr hier noch einen Weg?

    Hier hast du nicht einen einzelnen Zeiger angelegt, sondern ein Array mit 10 Zeigern. Das heißt, du müsstest jedes Element einzeln anlegen ( k1[5]=new Konto(); ) und wieder freigeben ( delete K1[5]; ). Ein delete direkt auf das Array angewendet ist undefiniertes Verhalten.



  • Hi,

    ich hab noch ne Frage dazu:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
        class Test {
    
              protected:
                      int a;
    
              public:
              void seta (int a) {this->a = a;}
    
              void ausgeben () {
                              cout << "a hat den Wert: " <<a << endl; }
    
              };
    
    int main(int argc, char *argv[])
    {
    
        Test *test1 = new Test[10];
    
        for(int i = 0; i < 10; i++) {
    
            test1[i].seta(i);      /////Warum schreibt man hier nicht test1[i]->seta(i)
                                   //// WAs würde test->seta(i) bewirken??
            test1[i].ausgeben();
    
            }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Könnt ihr mir bitte bei den Anmerkungen im Quelltext helfen?? Meine IDee:

    bei test1[i].seta(i) Wird direkt mit dem dereferenzierten Objekt gearbeitet, und nicht mit einem Zeiger?

    test1[i]-> seta(i) meldet einen Compilerfehler WARUM????

    test->seta(i) setzt für das erste Element des Arrays den Wert i?

    Was meint ihr dazu?

    Danke!



  • Mit
    Test *test1 = new Test[10];
    legst Du ein Array von 10 Objekten vom Typ Test an, und nicht etwa 10 Zeiger.
    testl[0] - testl[9] enthalten also Objekte, auf deren Member man mit dem .Operator zugreift. Der ->Operator funktioniert nicht, weil diese Arrayelemente keine Zeiger sind.

    Würdest Du ein Zeigerarray anlegen:
    Test *test1 = new Test*[10];
    müsstest Du vor dem Zugriff mit dem ->Operator die Objekte erst noch anlegen:

    for(int i = 0; i < 10; ++i)
        testl[i] = new Test;
    


  • Der -> -Operator dereferenziert und greift auf die Member zu.
    Der [] -Operator dereferenziert ein beliebiges Objekt.
    Der . -Operator greift auf die Member zu.



  • Hi!

    Der []-Operator dereferenziert ein beliebiges Objekt

    Das war das richtige Stichwort 🙂 Danke!

    Ein Array ist ja z.B. so aufgebaut:

    int array [] = {1,2,3,4};
    

    kann man dann z.B. auch so etwas in der Art machen:

    int *array[] = {1,2,3,4};
    

    Funktioniert zwar wie oben steht nicht, aber ich hoffe ihr versteht was ich meine? 🙂
    Es sollte so etwas in der Art rauskommen:

    Konto *k1 = new Konto [10];
    

    Dannke!

    Gruß



  • Sorry, ich verstehe dich nicht ganz.



  • Konto *k1; // Ein Zeiger
    k1 = new Konto [10]; // Ein Zeiger, der auf den Anfang eines Arrays zeigt, das aus 10 Konto-Elemente besteht.
    
    int array[] = {1,2,3,4}; // Ein Array, bestehend aus 4 int-Elementen.
    
    int *zeiger_array[4]; // Ein Array, bestehend aus 4 int-Zeigern.
    int i = 1;
    zeiger_array[0] = &i; // Zeiger (erste Element des Arrays) zeigt auf ein int.
    

Anmelden zum Antworten