Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Zeiger auf objekte

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.11.2002
    Beiträge
    61

    Zeiger auf objekte

    Ich habe mir ein Beispielprogramm fuer zeiger auf objekte mal angeschaut und da ist mir aufgefallen das der Zeiger der auf die Objekte automatisch bei new erhoet wird.
    Habe ich das so richtig verstanden?Ich brauch also bei dynamischer Speicherzuweisung mit new meinen Zeiger nicht erhoehen wenn ich ein neues Objekt erstelle?
    PHP-Code:
    #include <iostream.h>

    class Box
    {
       
    int Laenge;
       
    int Breite;
       
    Box *AndereBox;
    public:
       
    Box(void);          //Konstruktor
       
    void Setze(int NeueLaengeint NeueBreite);
       
    int HoleFlaeche(void);
       
    void ZeigeAufNaechste(Box *ZeigeDahin);
       
    Box *HoleNaechste(void);
    };

    Box::Box(void)        //Implementation des Konstruktors
    {
       
    Laenge 8;
       
    Breite 8;
       
    AndereBox NULL;
    }

    // Diese Methode setzt die Größe der Box auf die Parameter
    void Box::Setze(int NeueLaengeint NeueBreite)
    {
       
    Laenge NeueLaenge;
       
    Breite NeueBreite;
    }

    // Diese Methode berechnet den Flächeninhalt der Box und gibt ihn zurück
    int Box::HoleFlaeche(void)
    {
       return (
    Laenge Breite);
    }

    // Diese Methode lässt den Zeiger auf den Parameter zeigen
    void Box::ZeigeAufNaechste(Box *ZeigeDahin)
    {
       
    AndereBox ZeigeDahin;
    }

    // Diese Methode gibt die Box, auf die die momentane zeigt, zurück
    Box *Box::HoleNaechste(void)
    {
       return 
    AndereBox;
    }

    int main()
    {
    Box *Start NULL;    // Zeigt immer auf den Beginn der Liste
    Box *Temp;            // Arbeitstier
    Box *BoxZeiger;        // Für das Erzeugen von Boxen

                                 // Erzeuge die Liste
       
    for (int Index Index 10 Index++)
       {
        
    BoxZeiger = new Box;  //Hier mueste ich doch den zeiger normalerweise erhoehen?
        
    BoxZeiger->Setze(Index 1Index 3);
        if (
    Start == NULL)
        {
           
    Start BoxZeiger;             // Erstes Element in der Liste
        
    }
        else
        {
           
    Temp->ZeigeAufNaechste(BoxZeiger); // Zusätzliches Element
        
    }
        
    Temp BoxZeiger;
       }

                                 
    // Gib die Liste aus
       
    Temp Start;
       do
       {
        
    cout << "Der Flaecheninhalt ist " << Temp->HoleFlaeche() << "\n";
        
    Temp Temp->HoleNaechste();
       } while (
    Temp != NULL);

                                 
    // Lösche die Liste
       
    Temp Start;
       do
       {
        
    Temp Temp->HoleNaechste();
        
    delete Start;
        
    Start Temp;
       } while (
    Temp != NULL);

       return 
    0;
    }


    // Ergebnis beim Ausführen
    //
    // Der Flaecheninhalt ist 3
    // Der Flaecheninhalt ist 8
    // Der Flaecheninhalt ist 15
    // Der Flaecheninhalt ist 24
    // Der Flaecheninhalt ist 35
    // Der Flaecheninhalt ist 48
    // Der Flaecheninhalt ist 63
    // Der Flaecheninhalt ist 80
    // Der Flaecheninhalt ist 99
    // Der Flaecheninhalt ist 120 

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Bei new wird eine neue Instanz am Heap erzeugt.

    Keine Ahnung was du mit erhöhen meinst.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.11.2002
    Beiträge
    61
    Ich habe einen Array.Ein Zeiger zeigt zu Beispiel auf den ersten index.Um auf den 2. Index zu zeigen erhoehe ich den zeiger um 1 (pointer++) oder um auf den 5. Index zu zeigen ((pointer)*5) so habe ich das auf jeden fall bei c immer gemacht.

    Im Programm oben wird mit new ein neues Objekt erzeug auf das der zeiger zeigt.
    Nach dem durchlauf der for schleife nochmal eins aber ohne den Zeiger zu "erhöhen".

    Also meine Frage:Erhöht new den Zeiger automatisch?

    Also den zeiger im Speicher um die groesse des objekts verschieben?

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Original geschrieben von sven1978
    Um auf den 2. Index zu zeigen erhoehe ich den zeiger um 1 (pointer++) oder um auf den 5. Index zu zeigen ((pointer)*5) so habe ich das auf jeden fall bei c immer gemacht.
    Habe zwar keine Problemlösung, aber mich hat deine Aussage mit dem pointer * 5 verwirrt! Hab dann das mit einem Bsp-prog ausprobiert und ich bekomme einen syntax-fehler!

    Hmm, wieso multiplizieren?

    mfG

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von sven1978
    Ich habe einen Array.Ein Zeiger zeigt zu Beispiel auf den ersten index.Um auf den 2. Index zu zeigen erhoehe ich den zeiger um 1 (pointer++) oder um auf den 5. Index zu zeigen ((pointer)*5) so habe ich das auf jeden fall bei c immer gemacht.
    Ok, das versteh ich.


    Im Programm oben wird mit new ein neues Objekt erzeug auf das der zeiger zeigt.
    Nach dem durchlauf der for schleife nochmal eins aber ohne den Zeiger zu "erhöhen".
    Dieses Beispiel verwendet auch kein Array, sondern eine verkettete Liste.
    Jedes Element zeigt auf das nächste, bzw. das letzte zeigt auf NULL.

    Diese Zeile
    Code:
    Temp->ZeigeAufNaechste(BoxZeiger); // Zusätzliches Element
    besorgt das Einhängen des Elements in die Kette.


    Also meine Frage:Erhöht new den Zeiger automatisch?
    Nein, new ist mehr oder weniger wie malloc mit ein paar zusätzlichen Sachen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    21.07.2000
    Ort
    Österreich
    Beiträge
    189
    Original geschrieben von Silver
    Habe zwar keine Problemlösung, aber mich hat deine Aussage mit dem pointer * 5 verwirrt! Hab dann das mit einem Bsp-prog ausprobiert und ich bekomme einen syntax-fehler!
    ich bin sicher das war ein tippfehler, dass muss pointer+5 heißen.

    @zeiger

    warum glaubst du dass die zeiger nicht erhöht werden?
    ich bin mir sicher die zeiger werden "erhöht", sonst könntest du ja kein neues objekt anlegen, und du würdest nur das alte überschreiben.
    das erhöht steht unter anführungszeigen weil der pointer auf das 2. element nicht unbedingt pointer_erstes_element + 1 sein muss (und ziehmlich sicher auch nicht ist). mit new reservierst du dir nur speicher und es gibt den pointer auf die adresse zurück wo er reserviert wurde. aber da ja auf dem betriebsystem nicht nur das eine programm ausgeführt wird sondern auch (viele) andere und diese "paralell" ablaufen kommt es vor dass du mit new speicher reservierst, dann wird aber ein teil eines anderen programmes ausgeführt welches auch speicher reserviert oder freigibt. und somit hat wenn du dann ein 2. element mit new reservierst dieses nicht notwendigerweise die selbe speicheradresse+1.

    ich hoffe ich bin jetzt auf deine (ungenau formulierte) frage eingegangen, und hab nicht vorbeigeschrieben

  7. #7
    Registrierter Benutzer
    Registriert seit
    26.11.2002
    Beiträge
    61
    Ja ichb dennke das ist jetzt klar.



    ich bin sicher das war ein tippfehler, dass muss pointer+5 heißen.
    Ja war ein tippfehler. Ich meinte zb in einer Variablen merken wie oft der pointer verschoben wurde und ihn nun wieder auf den Anfang des Arrays zu setzen pointer
    -variable.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •