Array bestehend aus Zeigern



  • Also ich soll einen Stack simulieren.
    Mir ist schon klar, dass wenn ich dies mit einem Array mache, dies kein wirkliches Stack ist aber es geht jetzt einfach nur ums Prinzip!

    Dynamisch zur Laufzeit wir dbestimmt, wie groß den der Stack sein soll, also das Array!

    printf("Wie gross soll der Stack denn werden?");
        scanf("%i", &pgroesse);
        stack s1(pgroesse);
    

    Anschließend wird der Konstruktor aufegerufen:

    stack::stack(int pgroesse)
    {
        groesse = pgroesse;
        stackinhalt = new int[groesse];
        top = 0;
    }
    

    In einer anderen funktion erzeuge ich Objekte dynamisch vom Typ Person.
    Das Array soll nur die Adressen der Personen specihern.
    Wie geht das denn???



  • stackinhalt = new int[groesse];
    Person foo;
    stackinhalt[0]=(int*)&foo;



  • Wenn schon, dann

    Person *array[10];
    array[0] = new Person;
    //...
    delete array[0];
    
    //oder ganz dynamisch
    Person **array = new Person*[10];
    array[0] = new Person;
    delete array[0];
    delete [] array;
    

    Sieh dir die FAQ zu mehrdimensionsionalen Arrays an.

    Ich leitete mit "wenn schon" ein.
    D.h. es gibt bessere Methoden, zum Beispiel das Verwenden eines std::vector.
    Natürlich kommt es darauf an, ob die Aufgabenstellung vorgefertigte Container zulässt.



  • funktioniert dynamisch trotzdem verstehe ich net was du da genau gemacht hast!

    stack::stack(int pgroesse)
    {
        groesse = pgroesse;
        stackinhalt = new Person*[groesse];
        top = 0;
    }
    
    wobei
    
    class stack
    {
        private:
    
            Person **stackinhalt;
            int top;
            int groesse;
    
        public:
    
            stack(int pgroesse);
            void push(char *pnachname, char *pvorname, char*padresse, char *port,
                   int pplz, int ppnr);
            void pop();
            void set_groesse(int pgroesse);
            void print_stack();
            ~stack();
    
    };
    

    Ich verstehe net genau was da passiert!Genauergesagt diese 2 Sternchen bei stackinhalt wieso doppelt?



  • hmm ja was passiert denn hier genau?Wieso Zeiger auf Ziegr?Kann dies mal jemand erläutern?



  • Type** bedeutet Zeiger auf Zeiger auf Objekt vom Typ Type. Was gibt es da zu verstehen? (analog: Type*** - braucht man aber fast nie)



  • soorry aber ich bin net so unbedigt der c++ freak und mir ist klar, dass es zeiger auf zeiger heißt aber irgendwie kannst mir mal erklären wieso ich das mit dem doppelzeiger in diesem fall machen muss!



  • Das erste *, weil du new[] verwendest, obwohl die Standardbibliothek so viele bessere Container zur Verfügung stellt. Dass dynamische Arrays als * gehandhabt werden, finde ich reichlich dämlich (wie new[]/delete[] allgemein), aber du hast dich dafür entschieden 😉
    Das zweite, weil du gesagt hast, dass der Stack nur Zeiger auf die Elemente speichern soll.



  • ok und wieso kommt dann ein zeiger vor groesse?

    und wie spreche ich dann die teile an, dennn da mit kommt immer ein meory violation fehler!

    stackinhalt[i]->get_nachname()
    

    wobei get_nachname nur ein return nachname ist! 😃



  • Uninitialisierte Pointer?



  • Hallo,

    ich wuerd die 'push'-Funktion anders implementieren. Warum uebergibst du nicht
    einfach ein 'Person *' an 'push':

    void push(Person *);
    

    Ist m. E. nach einleuchtender, denn schliesslich willst du ja auch 'Personen'
    auf deinen Stack legen.

    Und 'pop()' wuerde ich eher als:

    Person *pop();
    

    implementieren, da man mit pop() das oberste Element eines Stacks zurueck-
    geliefert bekommt (und dieses dann vom Stack entfernt wird).

    mfg
    v R



  • operator void schrieb:

    ..., obwohl die Standardbibliothek so viele bessere Container zur Verfügung stellt.

    Zum Beispiel std::stack? 😉



  • davie schrieb:

    operator void schrieb:

    ..., obwohl die Standardbibliothek so viele bessere Container zur Verfügung stellt.

    Zum Beispiel std::stack? 😉

    Nein, das wär jetzt zu einfach. 😉


Anmelden zum Antworten