Pointer oder nicht Pointer, dass ist hier die Frage
-
Moinsen,
habe ein Problem und komme nicht auf die Lösung...
Zu allererst habe ich folgende Funktion
ZEIT* addTime(ZEIT* t1, ZEIT t2) { ZEIT *t = new ZEIT(); t->setHour(t1->getHour() + t2.getHour()); t->setMin(t1->getMin() + t2.getMin()); return t; }wobei ZEIT folgende Klasse darstellt
class ZEIT { public: ZEIT(void); ZEIT(int h, int min); ZEIT(ZEIT *t); ~ZEIT(void); void setHour(int a); void setMin(int a); void setTime(int a, int b); void setTime(ZEIT *t); void setActualTime(); int getHour(); int getMin(); ZEIT* getActualTime(); private: int h, min; };Hier noch einmal der Konstruktor
ZEIT::ZEIT(ZEIT* t) { this->h = t->getHour(); this->min = t->getMin(); }Die addTime-Funktion wird in der Main wie folgt aufgerufen
ZEIT *t1, *t2; ZEIT* aktZeit = new ZEIT(); aktZeit->setActualTime(); t1 = new ZEIT(addTime(aktZeit, ZEIT(0,1))); t2 = new ZEIT(addTime(aktZeit, ZEIT(0,2)));Ich habe den Fehler eindeutig auf die addTime-Funktion beschränken können.
Der Fehler ist, dass sobald addTime ein zweites Mal aufgerufen wird, der berechnete erste Wert überschrieben wird.Normalerweise würde ich denken, dass das Überschreiben eigentlich so nicht passieren dürfte. Dies würde eigentlich nur passieren, wenn man 1. in der addTime-Funktion keinen Pointer verwendet und 2. die errechnete Zeit nicht in eine neue Variable überschreibt sondern eben nur die Referenz benutzt.
Ich würde denken, dass Windows bei jedem Aufruf der addTime-Funktion einen neuen Speicherbereich reserviert und nicht immer wieder den Gleichen?!Kann mir jemand einen Tipp geben und mir sagen, wo mein Fehler liegt?
Randinfos:
Soll irgendwann mal auf einem Windows 7 Rechner laufen, Microsoft Compiler.Danke für die Hilfe :))
-
Deine Überlegungen sind nicht schlüssig. Der "erste berechnete Wert" von addTime ist doch dieses t, was zurückgegeben wird. Beim nächsten Aufruf von addTime siehst du den alten Wert nirgends mehr, jedenfalls wirfst du den Zeiger weg. Meinst du vielleicht, dass addTime die Werte in t1 verändert? Das wäre in der Tat seltsam.
Vielleicht ist es aber auch nur dein Compiler, der weint. Du programmierst C++, als wenn es Java wäre. Das ganze new ist in dem Programm völlig unangebracht, außerdem seh ich keine deletes.
Mal angenommen, du willst zu Lernzwecken in diesem Stil weitermachen, dann solltest du nochmal deine Beobachtung genauer beschreiben. Was liest du wie ab, was genau ändert sich wann?
-
Moin,
also es verhält sich, als würde ich nur die Adresse von dem berechnetem Wert speichern, denn sobald die addTime-Funktion erneut aufgerufen wird, wird der erste Wert auf eine 7-stellige Zahl geändert.
Das sehe ich, weil ich im weiteren Programm die beiden Zeiten in einer Textdatei logge und da dementsprechend der letztere Wert korrekt angegeben wird, jedoch alle Werte davor mit einer 7-stelligen Zahl angezeigt werden.
Zu den news und deletes:
Was meinst du denn damit, dass die news nicht angebracht wären?
Wenn ich ein Objekt speichern möchte und mit einem Pointer darauf referenziere, dann brauche ich ein new-Schlüsselwort um dem Compiler zusagen, dass ich vom Betriebssystem Speicherplatz zugewiesen haben möchte.
Ohne new kann ich allenfalls einen Verweis auf einen schon deklarierten Speicherbereich erstellen, wie zum Beispiel auf eine vorher deklarierte Integervariable, aber definitiv nicht auf unreservierten Speicher vom Betriebssystem.Die Deletes hab ich in der Tat vergessen

-
Hallo lost1994,
ich verstehe nicht so recht was du vorhast. Scheinbar möchtest du Instanzen der Klasse
ZEITerzeugen, in denen Stunden und Minuten gespeichert werden? Und scheinbar möchtest du z.B. aus zwei Instanzen einen dritte initialisieren, indem du Stunden und Minuten zusammenzählst?Hier mal ein Vorschlag, ob ich deine Intention richtig verstehe
#include <iostream> class zeit { public: zeit(double hour, double min):_hour(hour), _min(min){} double get_hour(){ return _hour; } double get_min(){ return _min; } private: double _hour, _min; }; int main() { zeit T1(1,1); zeit T2(2,2); zeit T3(T1.get_hour() + T2.get_hour(), T1.get_min() + T2.get_min()); std::cout << T3.get_hour() << "\t" << T3.get_min() << std::endl; return 0; }Gruß,
-- Klaus.
-
lost1994 schrieb:
Ohne new kann ich allenfalls einen Verweis auf einen schon deklarierten Speicherbereich erstellen, wie zum Beispiel auf eine vorher deklarierte Integervariable, aber definitiv nicht auf unreservierten Speicher vom Betriebssystem.
Nö. So würde man das normalerweise machen:
ZEIT addTime(ZEIT t1, ZEIT t2) { ZEIT t; t.setHour(t1.getHour() + t2.getHour()); t.setMin(t1.getMin() + t2.getMin()); return t; }oder gleich so:
ZEIT addTime(ZEIT t1, ZEIT t2) { return ZEIT(t1.getHour() + t2.getHour(), t1.getMin() + t2.getMin()); }Und wenn du nicht kopieren willst, keine Pointer nehmen, sondern Referenzen:
ZEIT addTime(const ZEIT& t1, const ZEIT& t2)Dieser Konstruktor:
ZEIT(ZEIT *t);ist ein merkwürdiger Ersatz für den normalen Kopierkonstruktor:
ZEIT(const ZEIT&);den der Compiler bereits automatisch generiert, sofern möglich.
UPPERCASE-Namen sind außerdem für Makros, enums und sonstige Konstanten gedacht, für Klassen oder Funktionen höchst unüblich.