const bei Funktionsparameter
-
Hallo,
warum kompiliert dieser code nicht?
error C2662: 'Dog::SaySomething': this-Zeiger kann nicht von 'const Dog' in 'Dog &' konvertiert werden
-
Weil die Memberfunktion
SaySomething()nichtconst-qualifiziert ist und somit nicht von konstanten Objekten aufgerufen werden kann. Sobald eine Methode das Objekt nicht verändert, sollte sieconst-qualifiziert sein. Das gilt insbesondere für Get-Funktionen.virtual void SaySomething() const;wäre die richtige Deklaration.
-
Ah alles klar, danke dir!

EDIT: Habe es geändert, aber es kommt immernoch der gleiche Fehler. Habe ich was falsch gemacht?
-
Ich sehe da kein eingefügtes const?
-
Na in der Basisklasse "Animal" ist eins, brauche ich in der abgeleiteten Klasse auch eins?
-
Kay schrieb:
Na in der Basisklasse "Animal" ist eins, brauche ich in der abgeleiteten Klasse auch eins?
Natürlich, die Deklarationen der Funktionen müssen schliesslich übereinstimmen. Das gilt auch für allfällige Funktionsdefinitionen ausserhalb der Klasse.
-
Natürlich muss das auch nocht in der abeleiteten Klasse hin...
Schau dir doch die Fehlermeldung wenigstens an.
-
Habe das const jetzt eingefügt, bekomme aber immernoch eine Fehlermeldung....:
// Abstrakte Basisklasse // #include <iostream> using namespace std; class Animal { public: Animal(){}; virtual void SaySomething() const; virtual ~Animal() {}; }; class Cat : public Animal { public: void SaySomething() {cout << "Miau!" << endl;} }; class Dog : public Animal { public: void SaySomething() const; }; class Fish : public Animal { public: void SaySomething() {cout << "Blub!" << endl;} }; void Dog::SaySomething() const { cout << "Wuff!" << endl; } void Action(Animal &theAnimal) { theAnimal.SaySomething(); } void Action2(Animal *theAnimal) { theAnimal->SaySomething(); } void Func( const int &Zahl) { cout << Zahl << endl; } void Func( const Dog &Snoopy ) { Snoopy.SaySomething(); } int main() { Dog MyDog; Cat MyCat; Fish MyFish; Action(MyCat); Action(MyFish); Action2(&MyDog); // als Referenz übergeben, da 'MyDog' kein Zeiger ist int Integer = 20; Func(Integer); // das geht nicht system("PAUSE"); return 0; }In function `main': undefined reference to `vtable for Animal' undefined reference to `vtable for Animal' undefined reference to `vtable for Animal' undefined reference to `vtable for Animal' undefined reference to `vtable for Animal' more undefined references to `vtable for Animal' follow t.o:(.gnu.linkonce.r._ZTI3Dog+0x8): undefined reference to `typeinfo for Animal' t.o:(.gnu.linkonce.r._ZTV3Cat+0x8): undefined reference to `Animal::SaySomething() const' t.o:(.gnu.linkonce.r._ZTI3Cat+0x8): undefined reference to `typeinfo for Animal' t.o:(.gnu.linkonce.r._ZTV4Fish+0x8): undefined reference to `Animal::SaySomething() const' t.o:(.gnu.linkonce.r._ZTI4Fish+0x8): undefined reference to `typeinfo for Animal'Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall Animal::SaySomething(void)const " (?SaySomething@Animal@@UBEXXZ)".
-
Willst du jetzt für jede abgeleitete Klasse extra fragen? Du musst es natürlich überall gleich machen. Bei Cat, Dog und Fish.
Außerdem sollte die Methode in Animal abstrakt sein, wenn du keine Implementierung anbieten willst. (daher kommt auch der Compilerfehler)

P.S. Poste den Code lieber hier im Forum (mit Codetags), da pasting Seiten den Code in der Regel nach 24 Stunden löschen.
-
Habe es abgeändert, jetzt funktioniert es, danke.

// Abstrakte Basisklasse mit const-Methoden // #include <iostream> using namespace std; class Animal { public: Animal(){} virtual void SaySomething() const = 0; virtual ~Animal() {} }; class Dog : public Animal { public: void SaySomething() const {cout << "Wuff!" << endl;} }; void Action(const Animal &theAnimal) { theAnimal.SaySomething(); } int main() { Dog MyDog; Action(MyDog); system("PAUSE"); return 0; }