PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger auf objekte



sven1978
27-07-2003, 15:55
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?
#include <iostream.h>

class Box
{
int Laenge;
int Breite;
Box *AndereBox;
public:
Box(void); //Konstruktor
void Setze(int NeueLaenge, int 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 NeueLaenge, int 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 = 0 ; Index < 10 ; Index++)
{
BoxZeiger = new Box; //Hier mueste ich doch den zeiger normalerweise erhoehen?
BoxZeiger->Setze(Index + 1, Index + 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

anda_skoa
27-07-2003, 17:07
Bei new wird eine neue Instanz am Heap erzeugt.

Keine Ahnung was du mit erhöhen meinst.

Ciao,
_

sven1978
27-07-2003, 19:01
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?

Silver
27-07-2003, 19:21
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

anda_skoa
27-07-2003, 20:09
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


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,
_

Alex_K
27-07-2003, 20:14
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 ;)

sven1978
28-07-2003, 09:28
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.