2016-11-15 5 views
0

Есть ли у вас какие-либо намеки на то, что не так с моим кодом? Я сделал это как можно проще и попытался выполнить поиск по всему Google, но до сих пор не знаю.«Выражение должно иметь тип класса» при вызове простого унаследованного метода

#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

Используйте новый универсальный синтаксис инициализатора: 'Dog doggy {};' –

+0

Все исправлено [здесь] (http: //coliru.stacked-crooked .com/а/0be113f40bce9bd6). –

ответ

4

Верьте или нет Dog doggy(); объявляет функцию имен doggy. Он возвращает значение Dog по значению и не принимает никаких параметров.

Чтобы изменить его, не используйте круглые скобки (если у вас нет параметров для pas) при определении объектов с автоматическим хранением. Просто сделайте Dog doggy;. В качестве альтернативы вы можете сделать это в C++ 11 и далее как Dog doggy{};

+1

также, если он наследует использование защищенных, он не сможет вызвать give_sound(), поскольку он не будет доступен. Ему нужно публичное наследование –

+0

что за черт? не пример собаки? Я начинаю с ++ и свои механизмы наследования, но теперь я еще более смущен. Как я могу это исправить? – IFeel3

+0

@ IFeel3, я сказал вам, удалите скобки (если вам не нужно передавать параметры). – StoryTeller

Смежные вопросы