【问题标题】:undefined reference, compilation error未定义的引用,编译错误
【发布时间】:2017-12-11 11:41:28
【问题描述】:

我正在尝试使用类继承。我从一本书中获取了一段代码,并对其进行了一些调整,以创建 Class Mammal 和一个继承 Mammal 成员数据的 Class Dog。代码是:

#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:(.text+0x16): 未定义对 `Dog::Dog()' 的引用 collect2.exe:错误:ld 返回 1 个退出状态

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 这两个类中的大多数方法都只是 DECLARATION,(即没有正文)。必须在某个地方实现(在 C++ 中:定义)
  • 你缺少括号 (Dog() { } )
  • Generic wisecrack:如果工具链抱怨 X(这里:“未定义”),X就是通常是它抱怨的原因。 ;-) Dog::Dog() 未定义。
  • 忘记定义构造函数真是个愚蠢的错误。谢谢大家的回复。

标签: c++ reference undefined


【解决方案1】:

你没有定义构造函数,你只是声明了它们:

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

...

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

当您声明构造函数(或任何函数)时,C++ 编译器将在别处查找构造函数的定义。当它找不到它时,它会抱怨。对于基本定义,试试这个:

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

...

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

您也可以完全删除它们,因为它们似乎没有做任何事情(C++ 将为您插入默认构造函数)。

【讨论】:

    【解决方案2】:

    你已经为类Dog::Dog();声明了构造函数,它没有被定义。意味着构造函数缺少主体。定义一个构造函数如下

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

    【讨论】:

    • 谢谢。它有帮助。
    【解决方案3】:

    这是因为您刚刚在各自的类中声明了非参数化构造函数Dog();Mammal();,但没有定义它。

    要消除错误,请执行以下操作:

    • class Mammal 中,将行 Mammal(); 更改为 Mammal(){} AND
    • class Dog 中,将行Dog(); 更改为Dog() {}

    【讨论】:

    • 谢谢。我现在明白了。
    • @OPP 如果您的问题得到解决,请接受并投票赞成答案。所以这个问题可以被认为是封闭的。
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多