wo ist der fehler
-
korrekt müsste es so heissen: (weil du es in der klasse so gemacht hast)
int T::setTime(int t) { timer_value = t; return t; }
obwohl das eigentlich quatsch ist (t übergibt man ja)
also s. DDR-RAMs post
void = kein rückgabewert
-
danke eure posts haben mir geholfen.
das void hat mir einige fehler gemacht, darum hab ich das "eigentlich" sinnlose return noch hinzugefügt.
ich habe allerdings noch immer ein(zwei) problemE://als anhaltspunkt /l.h class T : public QLCDNumber //vererbt ein objekt { Q_OBJECT public: int timer_value; // das war meine öffentliche variable die duch setTime() verändert wird T( QWidget * parent = 0, const char * name = 0); //DAS objekt QTimer timer; // public slots: void timeout(); int setTime(int); };
//main.cpp T t; t.setTime(99); t.show();
setTime verändert nun die öffentliche int variable "timer_value", will ich das ding mit show() anzeigen hat es keinen zugewiesenen wert?
DAS ist die implemntierung des objektsl.cpp T::T( ...) : QLCDNumber(...) //wie oben { display(timer_value); timer.start(timer_value); }
eigentlich müsste die varible nach dem setTime() einen wert zugewiesen bekommen haben und beim aufruf des objektes T(siehe oben müsste eine Zahl angezeigt werden. oder irre ich mich da?
-
müsstest mal versuchen für time_value speicher zu resrvieren. d.h. in der classe int *time_value im konstruktor time_value=new int;
und im destruktor halt delete time_value.
-
ich hab noch nie davon gehört das man für ne variable speicher reservieren muss.
eh ich wasverkehrt mache wie müsste das hier aussehen und warum muss man genau hier speicher reservieren?
oop ist komplizierter als ich dachte
wie hast du das am besten gelernt?
-
alaa schrieb:
ich hab noch nie davon gehört das man für ne variable speicher reservieren muss.
Musst du auch nicht, Blackhawk erzählt hier Käse.
alaa schrieb:
setTime verändert nun die öffentliche int variable "timer_value", will ich das ding mit show() anzeigen hat es keinen zugewiesenen wert?
Wenn dein Code so ist, wie du ihn hier postest, dann musst du noch irgendwelche anderen schlimmen Sachen machen?
Das Problem liegt vermutlich in deinem default ctor, welcher hier aufgerufen wirdT t;
Variablen elementarer Datentypen werden bei ihrer Definition nicht initialisiert, sofern keine static Lebensdauer vorliegt. Insofern hat timer_value noch keinen gültigen Wert. Sollte dein default ctor also so aussehen
T::T( ...) : QLCDNumber(...) //wie oben { display(timer_value); timer.start(timer_value); }
dann versuchst du lesend auf timer_value zuzugreifen (wobei ich die Definition von display nicht kenne), ohne vorher timer_value initialisiert zu haben. Was macht denn display? Den übergebenen Parameter anzeigen?
-
ich habe etwas gekürzt, das ist vollständig
#ifndef stats_h #define stats_h #include <qlcdnumber.h> #include <qtimer.h> #include "form1.h" class TCounter : public QLCDNumber { Q_OBJECT public: int timer_value; TCounter( QWidget * parent = 0, const char * name = 0); QTimer timer; QTimer counter; public slots: void timeout(); int setTime(int); }; #endif //lcd.h
//implementation int TCounter::setTime(int t) { timer_value = t; return t; } TCounter::TCounter( QWidget * parent, const char * name) : QLCDNumber(3, parent, name) { display(timer_value); setDecMode(); connect( &timer, SIGNAL(timeout()), this, SLOT(timeout())); timer.start(timer_value, false); } void TCounter::timeout() { display( intValue() -1); if (intValue() == 0) { timer.stop(); QMessageBox::information( this, "Timer", "Timer finished" ); } }
ja display übergibt dem objekt qlcdnumber einen wert vom typ int, der soll von setTime() festgelegt und von timeout runter gezählt werden.
-
ich habe nun
private: int timer_value;
,wie man sieht, timer_value private gemacht, und was passiert? ich habe sofort ein -99, was macht da bitte eine neg. zahl? misteriös
danke für bisherige hilfen
-
alaa schrieb:
wie man sieht, timer_value private gemacht, und was passiert? ich habe sofort ein -99, was macht da bitte eine neg. zahl?
timer_value private zu machen, ist auf jedenfall eine gute Idee. Warum du -99 "hast", kann dir hier niemand beantworten. Dazu müsste man schon die Implementierung von display() oder show() kennen.
-
auch wenn ich nicht gerne links mache:
http://www.qiliang.net/qt/qlcdnumber.html#display
allerdings entfernt sich das ein bisschen zu sehr, ansich muss doch nach dem setTime(99) diese varible einen einen wert haben;
nachdem ich sie private gemacht habe sehe ich auch einen ersten erfolg... aber warum nicht als sieh public war, ich weiß das das ziel der oop es ist solche sachen zu schützen aber prinzipiell... MUSS es funktionieren!
ich werd wohl noch ein bischen herumspielen müssen
-
Nochmal, du benutzt timer_value bereits im ctor
TCounter::TCounter( QWidget * parent, const char * name) : QLCDNumber(3, parent, name) { display(timer_value); setDecMode(); connect( &timer, SIGNAL(timeout()), this, SLOT(timeout())); timer.start(timer_value, false); }
obwohl noch nicht initialisiert.
Inwiefern sich das auf deine Anzeige auswirkt kann ich nicht beurteilen.