[C++] Pointer auf Klassenmethode nicht möglich?

  1. mdaniela

    mdaniela Thread StarterMacUser Mitglied

    Mitglied seit:
    03.03.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo Community!

    Ich bin noch C++ Neuling und erlerne mir die Sprache Schritt für Schritt auf meinem Mac. Ich bin nun auf ein Beispiel gestoßen, in dem ich einen Pointer erzeuge, der auf eine Klassenmethode zeigt.

    Das Beispiel stammt aus dem Buch "C++ in 21 Tagen" - eher auf Windows ausgerichtet - und lässt sich auf Mac nicht kompelieren.

    Meine Frage: Muss ich einfach anders an das Beispiel rangehen oder gibt's unter Mac keine Pointer auf Klassenmethoden? Zweiteres kann ich mir kaum vorstellen ...

    [Beispiel siehe unten]
    Z 66 + 67 bringen in xCode folgende Fehlermeldung:
    error: invalid use of non-static member function 'virtual void Animal::speak() const'
    error: cannot convert 'void ( Animal:: ) ()const' to 'void (Animal::*)()const' in assignment


    #include <iostream.h>
    4:
    5: class Mammal
    6: {
    7: public:
    8: Mammal():itsAge(1) { }
    9: virtual ~Mammal() { }
    10: virtual void Speak() const = 0;
    11: virtual void Move() const = 0;
    12: protected:
    13: int itsAge;
    14: };
    15:
    16: class Dog : public Mammal
    17: {
    18: public:
    19: void Speak()const { cout << "Wuff!\n"; }
    20: void Move() const { cout << "Bei Fuß gehen ...\n"; }
    21: };
    22:
    23:
    24: class Cat : public Mammal
    25: {
    26: public:
    27: void Speak()const { cout << "Miau!\n"; }
    28: void Move() const { cout << "Schleichen...\n"; }
    29: };
    30:
    31:
    32: class Horse : public Mammal
    33: {
    34: public:
    35: void Speak()const { cout << "Wieher!\n"; }
    36: void Move() const { cout << "Gallopieren...\n"; }
    37: };
    38:
    39:
    40: int main()
    41: {
    42: void (Mammal::*pFunc)() const =0;
    43: Mammal* ptr =0;
    44: int Animal;
    45: int Method;
    46: bool fQuit = false;
    47:
    48: while (fQuit == false)
    49: {
    50: cout << "(0)Beenden (1)Hund (2)Katze (3)Pferd: ";
    51: cin >> Animal;
    52: switch (Animal)
    53: {
    54: case 1: ptr = new Dog; break;
    55: case 2: ptr = new Cat; break;
    56: case 3: ptr = new Horse; break;
    57: default: fQuit = true; break;
    58: }
    59: if (fQuit)
    60: break;
    61:
    62: cout << "(1)Sprechen (2)Bewegen: ";
    63: cin >> Method;
    64: switch (Method)
    65: {
    66: case 1: pFunc = Mammal::Speak; break;
    67: default: pFunc = Mammal::Move; break;
    68: }
    69:
    70: (ptr->*pFunc)();
    71: delete ptr;
    72: }
    73: return 0;
    74: }

    Bin für jede Hilfe dankbar!
     
    mdaniela, 10.08.2006
  2. Black Smurf

    Black SmurfMacUser Mitglied

    Mitglied seit:
    16.03.2005
    Beiträge:
    1.527
    Zustimmungen:
    139
    Du kannst in C++ keinen Zeiger auf eine (nicht statische) Klassenfunktion haben, da diese immer ein Teil eines Objektes ist, d.h. es gibt nicht *die* Methode "Speak" der Klasse Mammal, sondern jedes Objekt hat seine eigene Methode "Speak". (Eine statische Klassenfunktion dagegen existiert einmal für die Klasse und ist nicht an ein Objekt gebunden, auf eine solche könntest du einen Zeiger setzten.)
    Ein Zeiger auf eine nicht statische Klassenmethode macht auch keinen Sinn, man benötigt einen Zeiger auf ein Objekt, dann kommt man schon an die zugehörige Methode: In deinem Beispiel bräuchtest du einen Zeiger auf ein Mammal (z. B. "Mammal* Tier") und könntest dann mit Tier->Speak() oder Tier->Move() die Methoden des entsprechenden Objekts aufrufen.
     
    Black Smurf, 10.08.2006
  3. mdaniela

    mdaniela Thread StarterMacUser Mitglied

    Mitglied seit:
    03.03.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Vielen Dank für die flotte Antwort! Klingt alles sehr plausibel, ist auch genau so im Buch beschrieben. Sehr komisch, dass dann ein nicht funktionierentes Programm im Buch abgedruckt wurde.
    Selbst die Ausgabe steht darunter:
    (0)Beenden (1)Hund (2)Katze (3)Pferd: 1
    (1)Sprechen (2)Bewegen: 1
    Wuff!
    (0)Beenden (1)Hund (2)Katze (3)Pferd: 2
    (1)Sprechen (2)Bewegen: 1
    Miau!
    (0)Beenden (1)Hund (2)Katze (3)Pferd: 3
    (1)Sprechen (2)Bewegen: 2
    Galoppieren...
    (0)Beenden (1)Hund (2)Katze (3)Pferd: 0
     
    mdaniela, 10.08.2006
  4. der_Kay

    der_KayMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    der_Kay, 10.08.2006
  5. minilux

    miniluxMacUser Mitglied

    Mitglied seit:
    19.11.2003
    Beiträge:
    13.975
    Zustimmungen:
    2.725
    türlich geht das
    den Code werde ich mir heute nicht mehr anschauen, morgen werd ich mal drüberschauen -- wenns bis dahin kein anderer getan hat ;)
     
    minilux, 10.08.2006
  6. der_Kay

    der_KayMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    Zeile 66 & 67 folgendermaßen ändern:

    case 1: pFunc = &Mammal::Speak; break;
    default: pFunc = &Mammal::Move; break;

    Die Zuweisung einer Adresse zu einem Zeiger auf eine Klassenmethode ohne Adressoperator ist nicht standard-konform, wird aber von einigen (vielen?) Compilern unterstützt. Es gibt sogar Compiler (egcs), die pFunc = ptr->Speak; akzeptieren; das geht aber nicht mit virtuellen Methoden.

    Übrigens sollte auch ein using namespace std; dazu.
    So ist das halt beim "Markt&Technik"-Verlag... :hamma: :motz:
     
    der_Kay, 10.08.2006
  7. Black Smurf

    Black SmurfMacUser Mitglied

    Mitglied seit:
    16.03.2005
    Beiträge:
    1.527
    Zustimmungen:
    139
    Oops!!! :o
    Ich sollte wohl besser beim reinen K&R-C bleiben...
     
    Black Smurf, 10.08.2006
  8. der_Kay

    der_KayMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    Ich bin mit C++ auch nie soooo richtig warm geworden... Zieh´Dir mal den Guru of the Week rein. :kopfkratz: :confused:
     
    der_Kay, 10.08.2006
  9. mdaniela

    mdaniela Thread StarterMacUser Mitglied

    Mitglied seit:
    03.03.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Besten Dank!

    Super, mit dem Adressoperator funktioniert das Ding! Beim Buch ist eine Testversion von MS Visual C++ dabei, damit hätte es vermutlich auch ohne Adressoperator funktioniert. Nö nö, diesen Mircroschrott greif ich nicht an, bleib bei xcode und programmiere standard-konform, wie es auch sein soll!

    Danke der_Kay und natürlich auch allen anderen!
     
    mdaniela, 11.08.2006
  10. Relampago

    RelampagoMacUser Mitglied

    Mitglied seit:
    26.06.2003
    Beiträge:
    112
    Zustimmungen:
    0
    gcc's g++ schluckt auch ein paar Sachen die nicht 100% konform sind :D
     
    Relampago, 11.08.2006
Die Seite wird geladen...
Ähnliche Themen - [C++] Pointer auf
  1. Wolfseye
    Antworten:
    16
    Aufrufe:
    310
  2. GeFa
    Antworten:
    9
    Aufrufe:
    601
    Gondomir
    15.08.2016
  3. kenny2332
    Antworten:
    5
    Aufrufe:
    747
  4. 123
    Antworten:
    5
    Aufrufe:
    815
  5. Psycho-Dad
    Antworten:
    38
    Aufrufe:
    1.912
    Psycho-Dad
    14.07.2008