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/a/0be113f40bce9bd6)。 –

答えて

4

Dog doggy();は、関数名doggyを宣言し、それを信じられないかもしれません。値でDogを返し、パラメータを受け入れません。

自動ストレージを使用してオブジェクトを定義するときに、括弧を使用しないでください(パスするパラメータがない場合)。ちょうどDog doggy;を実行してください。代わりに、あなたはC++ 11以降でこれを行うことができますDog doggy{};

+1

また、彼が保護されたを使用して継承する場合、アクセス不可能なので、give_sound()を呼び出すことはできません。彼は公共の継承を必要とする –

+0

何が一体?犬のインスタンスではない?私はC + +とその継承メカニズムをbeginginerだが、今私はさらに混乱している。どうすれば修正できますか? – IFeel3

+0

@ IFeel3、私はあなたに言った、(パラメータを渡す必要がない限り)かっこを削除します。 – StoryTeller

関連する問題