首页 > 解决方案 > 因错误消息未定义对“Fish::Fish(std::string)”的引用而苦苦挣扎

问题描述

我有这个 UML 图,我已经编写了下面的代码,但我正在努力处理一条错误消息

在此处输入图像描述

但是,在编译和链接时,出现错误

/tmp/cc9oQaPX.o: In function `main':
main.cpp:(.text+0x8c): undefined reference to `Fish::Fish(std::string)'
main.cpp:(.text+0xe5): undefined reference to `Cat::Cat(std::string)'
main.cpp:(.text+0x116): undefined reference to `Fish::Fish()'
main.cpp:(.text+0x158): undefined reference to `Cat::Cat()'
collect2: error: ld returned 1 exit status
#include <iostream>
using namespace std;
class Animal  // define base class 
{
protected:
    int legs;        // base class properties
public:
    Animal(int legNumbers)    // set values of leg
    {
        legNumbers = legs;   // set values of leg 
    }
    virtual void eat() = 0;  // method of base class
    virtual void walk() {}; // method of base class


};
class Pet      // define the pet class 
{
protected:
    string name;       // set properties of pet class 
public: 
    virtual string getName();       // define method
    virtual string setName(string name);    // set name values 
    virtual void play()          // define play method 
    {
        cout << " garfield is playing now." << endl;  // out values 
    }
};
class Spider :public Animal   //child class inherit base class
{
public:
    Spider() :Animal(8)   // spider class inherit animal class
    {
        cout << "animals with " << legs << " legs is walking. " << endl;
    }
    virtual void eat()   // define virtual method
    {
        cout << "spider is eating now. " << endl;
    }
};
class Cat :public Pet, public Animal  // cat inherit two classes 
{
public:
    Cat(string name);   // set name method
    Cat();       
    virtual void play()   // define method
    { 
        cout << name << " is playing now. " << endl;
    }
    virtual void eat();     // define method here

};
class Fish : public  Pet, public Animal  // fish inherit two method
{
public:        // define public members
    Fish(string name);
    Fish();
    virtual void play()
    {
        cout << name << " is playing now. " << endl;
    }
    virtual void eat();   // method here 
    void walk() 
    {
        cout << " Fish cannot walk " << endl;  // output the values 
    }
};

string Pet::getName()   // get name value from parent class
{
    return string();
}

string Pet::setName(string name)
{
    return string();
}
int main(int argc, char* argv[])   // define main method 
{
    Fish* f = new Fish("Jaws");
    Cat* c = new Cat("Tenkir");
    Animal *a = new Fish();
    Animal* e = new Spider();
    Pet* p = new Cat();
    f->play();
    c->play();
    e->eat();
    e->walk();
    a->walk();
    p->play();
    return 0;
}

标签: c++c++11visual-c++c++14

解决方案


这是正确的代码。

首先,您没有定义 Cat an Fish 的构造函数,但这不是唯一的问题。你的功能走路,吃饭,玩耍需要被覆盖。而且 eat() 必须有一个块,因为在基类 (Animal) 中被删除了,比如 eat() = 0;

#include <iostream>
using namespace std;
class Animal  // define base class 
{
protected:
    int legs;        // base class properties
public:
    Animal(int legNumbers)    // set values of leg
    {
        legs = legNumbers;   // set values of leg 
    }
    virtual ~Animal() {}
    virtual void eat() = 0;  // method of base class
    virtual void walk() {}; // method of base class


};
class Pet      // define the pet class 
{
protected:
    string name;       // set properties of pet class 
public: 
    virtual string getName();       // define method
    virtual void setName(string name);    // set name values 
    virtual void play()          // define play method 
    {
        cout << " garfield is playing now." << endl;  // out values 
    }
};

string Pet::getName()   // get name value from parent class
{
    return this->name;
}

void Pet::setName(string name)
{
    this->name = name;
}

class Spider :public Animal   //child class inherit base class
{
public:
    Spider() :Animal(8)   // spider class inherit animal class
    {
        cout << "animals with " << legs << " legs is walking. " << endl;
    }
    virtual void eat()   // define virtual method
    {
        cout << "spider is eating now. " << endl;
    }
};
class Cat :public Pet, public Animal  // cat inherit two classes 
{
public:
    Cat(string name)
    :Animal(4)
    {
        this->setName(name);
    }   // set name method
    Cat():Animal(4){}     
    ~Cat() override {} 
    virtual void play() override   // define method
    { 
        cout << name << " is playing now. " << endl;
    }
    virtual void eat() override {}     // define method here

};
class Fish : public  Pet, public Animal  // fish inherit two method
{
public:        // define public members
    Fish(string name)
    :Animal(0)
    {
        this->setName(name);
    }
    Fish():Animal(0){}
    ~Fish() override {}
    virtual void play() override
    {
        cout << name << " is playing now. " << endl;
    }
    virtual void eat() override {}  // method here 
    void walk() override
    {
        cout << " Fish cannot walk " << endl;  // output the values 
    }
};


int main(int argc, char* argv[])   // define main method 
{
    Fish* f = new Fish("Jaws");
    Cat* c = new Cat("Tenkir");
    Animal *a = new Fish();
    Animal* e = new Spider();
    Pet* p = new Cat();
    f->play();
    c->play();
    e->eat();
    e->walk();
    a->walk();
    p->play();
    return 0;
}

推荐阅读