2017-12-11 2 views
0

クラスの継承を使用しようとしています。私は本からコードを取り出し、クラス哺乳動物と哺乳動物のメンバーデータを継承するクラス犬を作成するために少し微調整しました。コードは次のとおりです。未定義の参照、コンパイルエラー

#include<iostream> 

enum BREED{Labrador,Alcetian,Bull,Dalmetian,Pomerarian}; 


class Mammal{ 

public: 
    Mammal(); 
    ~Mammal(){} 
    double getAge(){return age;} 
    void setAge(int newAge){age=newAge;} 
    double getWeight(){return weight;} 
    void setWeight(double newWeight){weight=newWeight;} 
    void speak(){std::cout<<"Mammal sound!\n";} 
protected: 
    int age; 
    double weight; 

}; 

class Dog : public Mammal{ 

public: 
    Dog(); 
    ~Dog(){} 
    void setBreed(BREED newType){type=newType;} 
    BREED getBreed(){return type;} 
private: 
    BREED type; 
}; 

int main(){ 
Dog Figo; 

Figo.setAge(2); 
Figo.setBreed(Alcetian); 
Figo.setWeight(2.5); 
std::cout<<"Figo is a "<<Figo.getBreed()<<" dog\n"; 
std::cout<<"Figo is "<<Figo.getAge()<<" years old\n"; 
std::cout<<"Figo's weight is "<<Figo.getWeight()<<" kg\n"; 
Figo.speak(); 

return 0; 
} 

私はこのコードを実行すると,,それは私に次のエラー与える:

C:\ cygwinの\ TMP \ cc7m2RsP.o:。prog3.cpp :(テキスト+ 0x16を) : `Dog :: Dog() 'への未定義参照 collect2.exe:エラー:ldが1の終了ステータスを返しました。

助けてください。ありがとう。

+0

ほとんどのメソッドのみ宣言(すなわち持たない本体)は次のようにコンストラクタを定義します。 (C++で定義されている) –

+1

括弧がない(犬(){}) –

+2

一般的なwisecrack:ツールチェーンがX(ここでは "undefined")に不平を言うと、X *は*それは文句を言う。 ;-) 'Dog :: Dog()'は定義されていません。 – DevSolar

答えて

0

パラメータ化されていないコンストラクタをそれぞれのクラスにDog();Mammal();として宣言しましたが、定義していないためです。

は、エラーが次の操作を行う削除するには、次の

  • class Mammalでは、チェンジ・ラインMammal();からMammal(){}Dog() {}class Dog
  • 、チェンジ・ラインDog();

    class Mammal{ 
    public: 
        Mammal(); // <-- declaration 
    
    ... 
    
    class Dog : public Mammal{ 
    public: 
        Dog(); // <-- declaration 
    

    あなたは、コンストラクタ(または任意の関数)を宣言し、その後C++コンパイラは、他の場所で、コンストラクタの定義を探します:

+0

ありがとうございます。分かりました。 – OPP

+0

@OPPあなたの問題が解決したら、答えを受け入れ、upvoteしてください。この質問は閉じたものとみなすことができます。 – cse

1

あなたはコンストラクタを定義していない、あなただけそれらを宣言しました。それが見つからないときは、それは不平を言う。基本的な定義では、これを試してみてください。

class Mammal{ 
public: 
    Mammal() {}; // <-- definition 

... 

class Dog : public Mammal{ 
public: 
    Dog() {}; // <-- definition 

彼らは何もしていないようですので、あなたはまた、それらを完全に削除することができます(C++があなたのためにデフォルトコンストラクタを挿入します)。

+0

ありがとう、奇妙な。私はそんなに愚かな間違いをした。 – OPP

0

クラスDog::Dog();のコンストラクタが宣言されていません。定義されていません。コンストラクタがボディを欠いていることを意味します。両方のクラスで

public: Dog::Dog(){ //statements }

+0

ありがとうございます。それは助けになった。 – OPP