2016-11-15 2 views
0

Habt ihr irgendwelche Hinweise, was mit meinem Code nicht stimmt? Ich habe es so einfach wie möglich gemacht und versucht, über Google zu suchen, habe aber immer noch keine Ahnung."Ausdruck muss Klassentyp haben" beim Aufrufen der einfachen geerbten Methode

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

class Animal { 
public: 
    Animal(); 
    Animal(string _sound) : 
     sound(_sound) {} 
    virtual ~Animal(); 
    void give_sound() { 
     cout << sound << " "; 
    } 
protected: 
    string sound; 
}; 

class Dog : protected Animal { 
public: 
    Dog(): Animal("woof") {} 
}; 

int main() { 

    Dog doggy(); 
    doggy.give_sound(); // expression must have class type 

    return 0; 
}  
+0

Verwenden Sie die neue, universelle Initialisierungssyntax: 'Dog doggy {};' –

+0

Alles behoben [hier] (http: //coliru.stacked-crooked .com/a/0be113f40bce9bd6). –

Antwort

4

Ob Sie es glauben oder nicht Dog doggy(); deklariert eine Funktion Namen doggy. Es gibt Dog als Wert zurück und akzeptiert keine Parameter.

Um es zu ändern, verwenden Sie keine Klammern (wenn Sie keine Parameter zu pas haben) beim Definieren von Objekten mit automatischem Speicher. Tun Sie einfach Dog doggy;. Alternativ können Sie es in C++ 11 und weiter als Dog doggy{};

+1

auch, wenn er mit geschützten erbt, er wird nicht in der Lage sein, give_sound() aufzurufen, wie es nicht zugänglich sein wird. Er braucht öffentliche Vererbung –

+0

was zum Teufel? keine Instanz von Hund? Ich beginne mit C++ und seinen Vererbungsmechanismen, aber jetzt bin ich noch verwirrter. Wie kann ich es reparieren? – IFeel3

+0

@ IFeel3, habe ich Ihnen gesagt, entfernen Sie die Klammer (es sei denn, Sie müssen Parameter übergeben). – StoryTeller

Verwandte Themen