Zeiger auf Elementfunktion unter kdevelop



  • Ich lerne gerade mit dem Buch C++ in 21 Tagen und bin jetzt auf ein Problem gestoßen. Ich benutze gcc - compiler unter kedevelop in SuSE Linux 10.0. Ich wollte einen Zeiger auf eine Elemenetfunktion,die keine Parameter aufnimmt erstellen und eine Elementfunktion aufrufen:
    void (Mammal::*pHorse)() const = Speak;
    Habs unter V c++ unter Microsoft getestet. Hat funktioniert. Aber in Kdevelop bekomme ich folgende Fehlermeldungen:
    Invalid use of non - ststic Function ...
    Cannot convert Mammal::*pHorse into Mammal::pHorse.
    Was kann ich machen?
    Hilfe! Bitte!



  • Zeig mal ein komplettes kleines Programm, das den Fehler zeigt.



  • #include <iostream>
    using namespace std;
    
    class Mammal
    {
    public:
    Mammal():itsAge(1) {}
    virtual ~Mammal() {}
    virtual void Speak() const = 0;
    protected:
    int itsAge:
    };
    
    class Dog : public Mammal
    {
    public:
    void Speak() const { cout << "Wuff" << endl; }
    };
    
    int main()
    {
    void *ptr = 0;
    ptr = new Dog;
    void (Mammal::*pFunc) const = 0:
    pFunc = Mammal::Speak;          // hier kommt es zur Fehlermeldung
    (ptr->*pFunc)();
    return 0;
    }
    

    Bei Visual c++ funktioniert das.
    Bei kdevelop kommt bereits erwähnte Fehlermeldung.
    Ich habe in den Projekteigenschaften rumprobiert. Wenn ich Programmausführung simulieren aktiviere, kann ich zwar ausführen, dafür kommt dann ein Speicherzugriffsfehler.

    //Edit: Codetags 🙄



  • Hm, kann es sein, dass im Buch einfach Mist steht oder Du das falsch verstanden hast?

    Schau Dir mal das hier an:
    http://www.josuttis.com/cppbuch/sonst/kompptr1.cpp.html

    Auch in den C++-FAQ gibt es dazu einen Eintrag:
    http://www.c-plusplus.net/forum_dev/viewtopic-var-t-is-39450.html

    edit: Ist aber ein Standard-C++-Problem, ich verschiebe Dich mal.



  • Wie wärs mal mit

    // ...
        int itsAge;                         // Tippfehler
        // ...
        Mammal *ptr = 0;                    // void macht hier glaub keinen Sinn, denn
                                            // wozu sonst der ganze Aufwand mit Dog  
                                            // und Mammal und so? Polymorphie...
        // ...
        void (Mammal::*pFunc)() const = 0;  // Tippfehler
    
        pFunc = &Mammal::Speak;             // Adresse, nicht die Funktion 
                                            // selber...pFunc
                                            // ist schliesslich ein Zeiger
    

    Zumindest hättest du die Tippfehler vermeiden können.



  • Hi,
    schmeiss das Buch weg, das ist scheisse.



  • DANKE euch allen. Das Buch ist übrigens wirklich scheiße. Ist nicht der erste Fehler über den ich gestolpert bin. Frage mich nur, warum vc++ den Fehler nicht moniert.



  • hmmm...ich weiss ja nicht, welche Auflage du vom Buch hast, aber ich hab gerade nachgeschaut und meine scheint recht OK zu sein. Dort steht auf Seite 533:

    // ...
        Mammal* ptr =0;  // Fehler von Ape64
        // ...
        case 1: pFunc = Mammal::Speak; break;  // Fehler im Buch
    

Anmelden zum Antworten