Statische Methode aufrufen funktioniert nicht



  • Hallo ihr Lieben,

    ich gehe zur Zeit ein Tutorial durch, um meine C++Fähigkeiten auszuweiten.

    ich habe folgenden Code

    #include <iostream>
    
    using namespace std;
    class Enemy 
    { 
    public: 
                        Enemy( void ); 
                        ~Enemy( void ); 
    
            void        Hello( void ); 
    
            static void Talk( void ); 
    }; 
    
    void Enemy::Hello( void ) 
    { 
            cout << "Enemy: Hello, how are you?\n"; 
    } 
    
    void Enemy::Talk( void ) 
    { 
            Hello(); 
    }
    
    int main (int argc, char *argv[])
    {
    
        Enemy::Talk();
      cin.get();
      return 0;
    }
    

    Letztlich bekomme ich folgende Fehler, obwohl es laut tut so funktionieren soll:

    In static member function `static void Enemy::Talk()':
    
    23 D:\Programme\Dev-Cpp\Source\Tutorial\tut4\tut41.cpp cannot call member function `void Enemy::Hello()' without object
    
    D:\Programme\Dev-Cpp\Source\Tutorial\tut4\Makefile.win [Build Error]  [Objects/MingW/tut41.o] Error 1
    

    Weiß jemand woran das liegen kann? Danke für Antworten



  • Steht doch da, du kannst Enemy::Hello() nicht ohne Objekt aufrufen.



  • Steht doch da: cannot call member function `void Enemy::Hello()' without object

    Enemy::Hello() ist nicht static . Trotzdem versuchst du es innerhalb von Enemy::Talk() ohne Objekt aufzurufen.



  • Na, schau mal genau hin wo der Fehler her kommt. Ist es die Funktion Talk oder Hello?



  • Ok wenn das schon eine offenbar dumme Frage war, dann bin ich gespannt was bei folgender passiert:

    Ändere ich

    void Hello( void );
    

    zu

    static void Hello( void );
    

    funktioniert das ganze. Achtung, die dumme Frage wie würde denn ein Aufruf mittels Objekt aussehen? 🤡


  • Mod

    FaceForce schrieb:

    . Achtung, die dumme Frage wie würde denn ein Aufruf mittels Objekt aussehen? 🤡

    objekt.Hello(); Was bei einer statischen Methode aber reichlich sinnlos ist.

    Und das ist wirklich eine etwas dumme Frage, weil das absolute Grundlagen sind die du in jedem Lehrbuch innerhalb der ersten Kapitel finden solltest.



  • Viel zu viel void da oben. Ich find's auch traurig, dass man immer wieder Code sieht, wo grundlos ein Defaultkonstruktor und ein Destruktor deklariert werden...

    Sicher, dass Dein C++ Tutorial der Primer (von Lipmann & co) ist? Es gibt da nämlich noch ein Buch "C++ Primer Plus" von einem ganz anderen Autor. Die Qualität vom Primer Plus ist angeblich recht mies. Man könnte sogar auf den Gedanken kommen, dass da einer mit dem "Primer"-Namen nur Geld verdienen will...



  • also das tutorial ist von

    http://www.online-tutorials.net/c-c++-c/c++-tutorial-kleine-einfhrung-in-die-oop/tutorials-t-1-230.html

    Eigentlich hatte ich erhofft hier unterstützung zu bekommen, falls ich nicht mehr weiter weiß. Aber ich merke, ohne Buch wird das nichts mit dem C++ lernen...



  • FaceForce schrieb:

    Eigentlich hatte ich erhofft hier unterstützung zu bekommen, falls ich nicht mehr weiter weiß. Aber ich merke, ohne Buch wird das nichts mit dem C++ lernen...

    Wenn du bei einzelnen Fragen nicht mehr weiter weißt, kriegst du durchaus auch Unterstützung. Deine beiden Fragen wurden hier ja auch beantwortet. Allerdings gehören die Themen wie schon gesagt wurde zu den Grundlagen, die in deinem Buch stehen sollten. Das solltest du nicht als Kritik auffassen sondern als Hinweis, dass es vermutlich sinnvoll wäre, dir ein Grundlagenbuch zuzulegen und damit viele wichtige Details zu lernen.
    Du musst kein Buch lesen, du kannst natürlich auch weiterhin mit Grundlagenfragen hier ankommen. Aber das hat einige Nachteile:

    1. Musst du jedesmal ne Weile warten, bis eine Anwort kommt, statt einfach ein paar Seiten weiterzulesen,
    2. werden spätestens nach der 10. Grundlagenfrage die Leute etwas unleidlich. Siehe auch mein Link unten, Punkt "Eigeninitiative" 🙂


  • In Deinem Tutorial steht übrigens:

    Dieser Code würde nicht funktionieren, da die Methode Hello unstatisch ist und nicht von der statischen Methoden(sic) Talk aufgerufen werden kann.

    Du solltest Dir angewöhnen zu genau lesen (so auch bei der o.g. Fehlermeldung).
    Genauigkeit ist eine Grundanforderung, wenn Du programmieren willst.



  • Also von programmieren wollen kann nicht die Rede sein, dass C++ absolutes neuland ist schon. @Caligulaminus weil aufmerksames Lesen so wichtig ist:

    Gleichermaßen ist dieser Code fehlerhaft. Da die statische Methode Talk nicht von einer bestehenden Instanz der Klasse Enemy aufgerufen werden kann.

    Zu beachten ist aber, das manche Compiler diesen Fehler ausbügeln und nicht als Fehler anzeigen.

    Der korrekte Aufruf der Methode Talk wäre also folgender:

    int main(int argc, char *argv[]) 
    { 
            Enemy::Talk(); 
    
            return 0; 
    }
    

    Wie mein ursprünglicher Quellcode...aber egal!

    Also ich denke nicht, dass ich mir vorzuwerfen habe unachtsam zu sein. Programmieren ist letztlich eine Kunst! Ich sehe meinen Fehler bei der Ausführung des Tutorials nicht. Was auch letztlich egal ist, da ich mich entschieden habe erst ein mal ein Buch zu lesen.

    So zu sagen erstmal lernen das Bein zu heben, bevor ich mit den großen Hunden pissen gehe 😉

    Trotzdem danke für die Zeit die investiert wurde 😋



  • Der von mir zitierte Satz bezog sich auf die Klasse.

    Das von Dir zitierte

    Der korrekte Aufruf der Methode Talk wäre also folgender:

    bezieht sich auf den Aufruf von Talk() in main().
    Ich würde auch sagen, daß das Tutorial hier etwas "unglücklich" formuliert ist.
    Es bleibt aber dabei, daß Du Dich über einen Fehler gewundert hast, der
    a) im Tutorial angekündigt wurde.
    und
    b) von Deinem Compiler in der Fehlermeldung klar genannt wurde.
    Darauf bezog sich mein Rat, genauer zu lesen.

    Wenn Du aber ehrlich meinst, daß bei Deinen Versuchen C++ zu lernen von "programmieren wollen nicht die Rede sein kann", dann sind unsere Paralleluniversen wohl einfach ein wenig zu weit voneinander entfernt.

    P.S. Mein Rat war ehrlich- und gutgemeint. Wenn Du Dich angegriffen fühlst, dann nichts für ungut; und ich bin dann mal weg.



  • @Caligulaminus

    ...

    mehr habe ich dazu nicht zu sagen! Befolge mal deinen Ratschlag und ließ die von mir geschriebenen Worte. Ja ich programmiere, C++ nein!

    Das mein Können = 0 ist habe ich bereits festgestellt(So dumm bin ich nicht!). Da hilft aber auch kein genaueres lesen! Deshalb Buch! Weil Buch viel freundlicher, geduldiger und ratsamer 😃 !

    Du bist mal weg? Das Feld der Diskussion habe ich schon in meinem letzten Threat geräumt. Der Beitrag kann auch gerne geschlossen werden. Weil weiter komme ich so sicherlich nicht und Speicherplatz verschwenden muss er auch nicht.

    Wohl bekomme es dir in der parallelen Welt für deine Zeit und Rat habe ich gedankt, dass soll es auch gewesen sein 😉 Sollte ich tatsächlich noch lernen mit C++ umzugehen bist du jedenfalls der erste dem ich es erzähle 🕶 ->und das ist eine 'Blindenbrille' damit dir klar ist in welcher Situation ich mich selbst sehe...


Anmelden zum Antworten