Klassenzusammenhänge verstehen



  • Heyho, da ich Beginner bin, würde ich mich freuen wenn mir jemand mal ein paar Zusammenhänge bei Klasse erklären kann...

    folgendes:

    yada.h

    class test {
      public:
    
        int zahl;
        void machwas();
        void aufruf();
    
    }
    

    yada.cpp

    void test::machwas(){
       cout << zahl;
    }
    
    void test::aufruf(){
       machwas();
    }
    

    main

    int main(){
      test* t = new test();
      t->zahl = 1234;
      t->machwas();
      t->aufruf();
      delete t;
    }
    

    gibt einmal 12 und einmal (bei aufruf() ) 0 aus. Warum??
    Wie kann ich denn innerhalb der Klasse (jeweiligen Instanz) auf die Variable "Zahl" zugreifen?



  • Erstmal glaube ich nichtmal, daß dieser Code compilieren wird (test hat keine Methode aufruf(), dein machwas() ist eine globale Funktion und nutzt eine undefinierte Variable, test::machwas() ist gar nicht definiert (da dürfte sich der Linker freuen), new wird nur zur Erzeugung von Pointern verwendet,...).

    Desweiteren: In einer Memberfunktion von test kannst du einfach über den Namen auf die Membervariablen (und ander Funktionen) zugreifen. Wenn du explizit den Zusammenhang kennzeichnen willst, kannst du auch "this->zahl" schreiben (ist aber unnötig).



  • ja das stimmt, da kam wieder der genannte beginner durch. diesen code hab ich eben kurz aus dem kopf hingeschrieben, habs nun verbessert.

    also,

    void blubb( void )
    

    bedeutet globale Funktion?

    wenn es so wie oben steht, müsste es laufen?
    Dann liegt mein Fehler woanders.

    Konkret habe ich eine Klasse (vereinfacht):

    pcfr.h

    class pcfr {
    
       public:
         m_timeCode;
         void setTimeCode(double tcode);
         double getTimeCode();
         CString getTimeString();
    
    }
    

    pcfr.cpp

    void pcfr::setTimeCode(double tcode){
        m_timeCode = tcode;
    }
    
    double pcfr::getTimeCode(){
        return m_timeCode;
    }
    
    void pcfr::drawString(){
        CString clock = getTimeString();
    }
    
    CString pcfr::getTimeString(){
        CString ts;
        // Umwandlung des doubles - m_timeCode
        return ts;     
    }
    

    ich habe in der main eine deque, in der pointer auf die instanzen von pcfr liegen, und rufe dann mittels

    // dq ist die deque
    
    dq.at(i)->DrawString();
    

    die Methode auf.

    Dies scheitert daran, dass der debugger sagt, der sich zu dem Zeitpunkt in pcfr::getTimeString() befindet, dass m_timeCode nicht instanziiert ist (NullPointer).

    rufe ich jedoch
    double test = dq.at(i)->getTimeCode() auf, kriege ich den richtigen Inhalt.



  • Kann es sein, daß du den Typ von m_timecode unterschlagen hast? Und die Klasse hat auch kein Member 'DrawString()' (jedenfalls nicht in der Klassendeklaration).

    wenn es so wie oben steht, müsste es laufen?

    Wenn du die Variable t noch als 'test*' deklarierst, ja.



  • Problem gelöst.

    In meinem Programm (in einem Dialog) habe ich zwei mal (in zwei verschiedenen spaces, also einmal global und einmal in einer Funktion) meine Variable (pcfr* frame) definiert. Initialisiert wurde sie aber nur in meiner zweiten Definition.

    Ich habe es nicht bemerkt, da ich bisher nur in der Funktion gearbeitet habe, in der ich sie das auch initialisiert habe.

    Daher kam der NullPointer, da ich nun versuchte, auf die globale zuzugreifen. ärgerlich...

    Vielen Dank jedenfalls trotzdem. Ich dachte ich hätte irgendwelche Zusammenhänge nicht richtig verstanden.


Anmelden zum Antworten