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 objekts

    l.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 wird

    T 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.


Anmelden zum Antworten