[c++] Implementation einer Liste?

radazong

Mitglied

Hallo!

Ich habe folgendes Problem:
Ich habe mir eine Klasse geschrieben(ohne große Funktionalität, nur zum testen), in der ich auch Methoden habe, die auf ein weiteres Objekt dieser Klasse zeigen sollen. Das Zuweisen klappt auch soweit ganz gut.
Nur wenn ich jetzt nachdem ich auf das Objekt zeige, dessen Werte ändere, wird das bei der Ausgabe nicht berücksichtigt? Was mache ich falsch? Hier erstmal der Code:
Code:
#include <cstdlib>
#include <iostream>

using namespace std;

class box
      {
          int x,y;
          box* Zeiger;
          public:
          box();
          void Set(int iX,int iY){x=iX;y=iY;}
          int Get(){return x*y;}
          void ZeigeAuf(box Box){Zeiger=&Box;}
          box HoleZeiger(){return *Zeiger;}
          friend box operator + (box a, box b){box temp; temp.x=a.x; temp.y=a.y+b.y; return temp;}
          ~box();
      };
      box::box()
      {
                Zeiger=NULL;
                x=5;
                y=5;
      }
      box::~box()
      {}


int main()
{
box test,add;
test.Set(10,20);
add.Set(2,5);

test.ZeigeAuf(add);

box sum=test.HoleZeiger();
add.Set(2,2);
cout<<"test ist "<<test.Get()<<" add ist "<<add.Get()<<endl;

cout<<"Summe ist "<<sum.Get()<<" Test ist "<<test.Get()<<endl;

system("PAUSE");
return 0;
}

Die Ausgabe ist jetzt allerdings:
test ist 200 add ist 4
Summe ist 10, test ist 200


Eigentlich müssten doch jetzt die Werte an der Adresse auf die der Zeiger zeigt, auch geändert sein, oder verdaddel ich da grad was?

Ich benutze Dev C++ mit integriertem GCC Compiler.
Vielen Dank schonmal im Voraus,

Gruß
 
Zuletzt bearbeitet:
Hmmm,
Mag mir keiner helfen, oder kann mir keiner helfen?
Oder ist der Titel einfach nicht eindeutig genug?! :confused:

Naja, rätsel jedenfalls immernoch an dem Problem, und bin für jede helfende Antwort dankbar.

MfG
 
Hallo,
Hmmm,
Mag mir keiner helfen, oder kann mir keiner helfen?
Oder ist der Titel einfach nicht eindeutig genug?! :confused:

Naja, rätsel jedenfalls immernoch an dem Problem, und bin für jede helfende Antwort dankbar.

MfG

versuch doch mal:

C++:
void ZeigeAuf(box Box){Zeiger=&Box;}
in
C++:
void ZeigeAuf(box *Box){Zeiger=Box;}
//...
box test,add;
//...
//Aufruf:
test.ZeigeAuf(&add);

zu ändern, denn bei der ersteren Variante wird eine Kopie von add erzeugt, bei der zweiten Variante wird nur der Zeiger &add kopiert ...

Gruß,
RedWing
 
Vielen dank für die Antwort, aber leider

"Same Procedure as last Compile" .... bekomme da genau das gleiche Ergebnis...komisch. Aber der müsste doch auf die richtige Adresse zeigen, oder? und wenn ich 'add' ändere, ändert sich doch auch nur der Wert im selben Adressbereich?!

Ich bin schockiert, dass ich an so einem Problem jetzt scheitere, zumal es nur eine kurze Kenntnisauffrischung werden sollte :suspekt: .

Aber wenn zufällig noch jemand eine Idee hat, wäre ich sehr dankbar :).

EDIT:

Wenn ich der Variablen 'sum' nach Aufruf der Set() Methode von 'add' wieder "test.HoleZeiger()" zuweise, haut es hin. Aber wieso nur, ich steig da echt gerade nicht durch?!
 
Zuletzt bearbeitet:
Hmm... Hallo!
Wollte das Thema nur noch einmal pushen, da ich mit dem Problem immernoch nicht weitergekommen bin. Vielleicht durchschaut ja irgendjemand, was ich falsch mache?
Naja, schönen Dank schon im Voraus,
LG
 
So wie ich das Programm verstehe bzw. durchgegangen bin, ist es völlig richtig.
C:
box test,add;
test.Set(10,20);
add.Set(2,5);
test.ZeigeAuf(add);
box sum=test.HoleZeiger();
add.Set(2,2);
1. test und add werden mit dem Constructor initialisiert (x und y = 5, Zeiger = 0)
2. test (x =10, y=20, Zeiger = 0)
3. add (x=2, y=5, Zeiger = 0)
4. test (x=10, y=20, Zeiger auf add)
5. sum per Zuweisungsoperator (da Zeiger auf add -> x=2, y=5, Zeiger = 0)
6. add wird neu gesetzt (x=2, y=2, Zeiger = 0)
7. Ausgabe

Was erwartest du ? ;-)

mfg
 
Code:
class box
{
         ...
          box HoleZeiger(){return *Zeiger;}
       ...
}

int main()
{
...

box sum=test.HoleZeiger();
add.Set(2,2);
...
}


Bei der Rückkehr aus der Methode box::HoleZeiger() erzeugst du eine Kopie des in test verlinkten Objekts (falls Zeiger überhaupt auf ein Objekt zeigt und nicht 0 ist, was zu einem Programmabsturz führen würde!:eek:). Dies ist nicht mehr das Objekt add, wenn du also add änderst, tangiert das sum nicht. Nach der Änderung des Codes gemäß RedWing, zeigt Zeiger im Objekt test wirklich auf add, d.h. ein erneutes Aufrufen von test.HoleZeiger() nach der Änderung von add weist dem Objekt sum eine Kopie des geänderten add-Objekts zu.

Ehrlich gesagt, weiß ich nicht genau, was du eigentlich machen willst: soll sum.Get() nach add.Set(2,2) 4 zurückliefern? Dies ginge nur, wenn sum eine Referenz box& (oder ein Pointer box*) wäre. Dann müßtest du aber in box::HoleZeiger() eine Referenz (oder einen Pointer) zurückgeben.

Gruß
Peter
 
Hi.

C++:
  add.Set(2,5);

  test.ZeigeAuf(&add);

  box sum = test.HoleZeiger();
  add.Set(2,2);
Du setzt erstmal add.x auf 2 und add.y auf 5. Dann setzt du test.Zeiger auf &add. Gut.

Dann fragst du den Zeiger von test wieder ab, dereferenzierst und weist das Objekt als Kopie an sum zu. Dabei ist sum.Zeiger übrigens NULL.

Du änderst zwar add.x und add.y, wenn du die Methode Get() aufrufst benutzt du doch den Zeiger gar nicht!? Oder hast du etwa erwartet, dass sich sum.x und sum.y ändern? Was sollte denn deiner Meinung nach herauskommen?

Gruß
 
Hmm, wenn ichs mir recht überlege hast du wohl recht. Eigentlich sollte sum irgendwie eine Referenz auf add sein. Aber das war wohl ein Denkfehler von mir. Naja, vielen Dank auf jeden fall für die doch noch zahlreichen Antworten.
Thread ist damit erledigt,
Gruß
 
Zurück