RAHUL
22-11-2005, 11:31
Hallo,
ich habe hier wieder so eine Beispielaufgabe und weiss nicht ob ich wieder
einfach ein blöden kleinen Fehler gemacht habe oder die Aufgabe im Buch nicht richtig
ist.
Hier ist der Code
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1) {}
virtual ~Mammal() {}
virtual void Speak() const = 0;
virtual void Move() const = 0;
protected:
int itsAge;
};
class Dog: public Mammal
{
public:
void Speak() const { cout << "Wuff!\n";}
void Move() const {cout << "Bei Fuss gehen...\n";}
};
class Cat: public Mammal
{
public:
void Speak() const { cout << "Miau!\n";}
void Move() const {cout << "Schleichen...\n";}
};
class Horse: public Mammal
{
public:
void Speak() const { cout << "Wieher!\n";}
void Move() const {cout << "Gallopieren...\n";}
};
int main()
{
void (Mammal::*pFunc)() const = 0;
Mammal * ptr = 0;
int Animal;
int Method;
bool fQuit = false;
while (fQuit == false)
{
cout << "(0)Beenden\n";
cout << "(1)Hund\n";
cout << "(2)Katze\n";
cout << "(3)Pferd\n";
cin >> Animal;
switch(Animal)
{
case 0:
fQuit = true;
break;
case 1:
ptr = new Dog;
break;
case 2:
ptr = new Cat;
break;
case 3:
ptr = new Horse;
break;
default:
cout << "\nFalsche Eingabe!\n\n";
continue;
break;
}
if (fQuit == true)
break;
cout << "(1)Sprechen\n";
cout << "(2)Bewegen\n";
cin >> Method;
switch(Method)
{
case 1:
pFunc = Mammal::Speak;
break;
case 2:
pFunc = Mammal::Move;
break;
default:
cout << "\nFalsche Eingabe!\n\n";
continue;
break;
}
(ptr->*pFunc)();
delete ptr;
}
return 0;
}
und die Fehlermeldung des Compilers:
Listing_14_10.cpp: In function `int main()':
Listing_14_10.cpp:86: Fehler: ungültige Verwendung der nicht-statischen Elementf unktion »virtual void Mammal::Speak() const«
Listing_14_10.cpp:86: Fehler: »void (Mammal:: )() const« kann nicht nach »void (M ammal::*)() const« in assignment umgewandelt werden
Listing_14_10.cpp:89: Fehler: ungültige Verwendung der nicht-statischen Elementf unktion »virtual void Mammal::Move() const«
Listing_14_10.cpp:89: Fehler: »void (Mammal:: )() const« kann nicht nach »void (M ammal::*)() const« in assignment umgewandelt werden
Also ich habe das Program soweit verstanden, dass ein Zeiger auf ein Objekt und
ein Zeiger auf eine Methode erzeugt wird.
Der Zeiger auf die Methode wird aber auf die Basisklasse eingerichtet und dann bei
dem jeweiligen Objekt weitergeleitet an die Methode des Objektes.
Vielleicht kann mir das jemand noch besser erklären, was da passiert.:confused:
Danke
ich habe hier wieder so eine Beispielaufgabe und weiss nicht ob ich wieder
einfach ein blöden kleinen Fehler gemacht habe oder die Aufgabe im Buch nicht richtig
ist.
Hier ist der Code
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1) {}
virtual ~Mammal() {}
virtual void Speak() const = 0;
virtual void Move() const = 0;
protected:
int itsAge;
};
class Dog: public Mammal
{
public:
void Speak() const { cout << "Wuff!\n";}
void Move() const {cout << "Bei Fuss gehen...\n";}
};
class Cat: public Mammal
{
public:
void Speak() const { cout << "Miau!\n";}
void Move() const {cout << "Schleichen...\n";}
};
class Horse: public Mammal
{
public:
void Speak() const { cout << "Wieher!\n";}
void Move() const {cout << "Gallopieren...\n";}
};
int main()
{
void (Mammal::*pFunc)() const = 0;
Mammal * ptr = 0;
int Animal;
int Method;
bool fQuit = false;
while (fQuit == false)
{
cout << "(0)Beenden\n";
cout << "(1)Hund\n";
cout << "(2)Katze\n";
cout << "(3)Pferd\n";
cin >> Animal;
switch(Animal)
{
case 0:
fQuit = true;
break;
case 1:
ptr = new Dog;
break;
case 2:
ptr = new Cat;
break;
case 3:
ptr = new Horse;
break;
default:
cout << "\nFalsche Eingabe!\n\n";
continue;
break;
}
if (fQuit == true)
break;
cout << "(1)Sprechen\n";
cout << "(2)Bewegen\n";
cin >> Method;
switch(Method)
{
case 1:
pFunc = Mammal::Speak;
break;
case 2:
pFunc = Mammal::Move;
break;
default:
cout << "\nFalsche Eingabe!\n\n";
continue;
break;
}
(ptr->*pFunc)();
delete ptr;
}
return 0;
}
und die Fehlermeldung des Compilers:
Listing_14_10.cpp: In function `int main()':
Listing_14_10.cpp:86: Fehler: ungültige Verwendung der nicht-statischen Elementf unktion »virtual void Mammal::Speak() const«
Listing_14_10.cpp:86: Fehler: »void (Mammal:: )() const« kann nicht nach »void (M ammal::*)() const« in assignment umgewandelt werden
Listing_14_10.cpp:89: Fehler: ungültige Verwendung der nicht-statischen Elementf unktion »virtual void Mammal::Move() const«
Listing_14_10.cpp:89: Fehler: »void (Mammal:: )() const« kann nicht nach »void (M ammal::*)() const« in assignment umgewandelt werden
Also ich habe das Program soweit verstanden, dass ein Zeiger auf ein Objekt und
ein Zeiger auf eine Methode erzeugt wird.
Der Zeiger auf die Methode wird aber auf die Basisklasse eingerichtet und dann bei
dem jeweiligen Objekt weitergeleitet an die Methode des Objektes.
Vielleicht kann mir das jemand noch besser erklären, was da passiert.:confused:
Danke