由于未定义的引用而导致C ++程序出错

时间:2012-02-24 08:31:01

标签: c++ oop

在Bird类中,有一个虚函数canFly(),它在两个类中实现:Parrot和Crow。 G是一个全球类,它会记住no。鸟类(即乌鸦或鹦鹉)然后printBirds()打印鸟类的飞行能力。

但由于未定义的引用,我收到了一些错误。有人可以解释一下。为什么会出现这些错误以及如何纠正程序以消除错误。

#include <iostream>
using namespace std;
class Bird
{
    bool abilityToFly;
    public:
    Bird()
    {
        abilityToFly=0;
    }
    bool getAbility()
    {
        return abilityToFly;
    }
    void setAbility(bool x)
    {
        abilityToFly=x;
    }
    virtual void canFly()
    {
        abilityToFly=0;
    }
};

class Crow: public Bird
{
     public:
    void canFly()
    {
        setAbility(1);
    }
};

class Parrot: public Bird
{
    public:
    void canFly()
    {
         setAbility(1);
    }
};

class G
{
    public:
    static int numBirds;
    static Bird *b[10];
    static void addBird(Bird bird)
    {
         b[numBirds]= &bird;
         numBirds++;
         if (numBirds>10)
         cout<<"Error in program";
    }
    static void printBirds()
    {
         for(int i=0;i<numBirds;i++)
         {
         cout<<"Bird "<<i<<"'s ability to fly"<<b[i]->getAbility();
         }
    }
 };
 int G::numBirds=0;

 int main()
 {
     Parrot p;
     p.canFly();
     Crow c;
     c.canFly();
     G::addBird(p);
     G::addBird(c);
     G::printBirds();
     return 0;
 }

错误是:

 In function `main':
 undefined reference to `G::b'
 undefined reference to `G::b'
 undefined reference to `G::b'

代码的链接是: http://codepad.org/Mjpu4wFv

1 个答案:

答案 0 :(得分:6)

G :: b是静态数据成员,您应该初始化它。

int G::numBirds=0;
Bird * G::b[10];

代码中的另一个错误,您应该修改如下:

static void addBird(Bird* bird)
{
    b[numBirds] = bird;
    numBirds++;
    if (numBirds>10)
    cout<<"Error in program";
}

并在main()中:

G::addBird(&p);
G::addBird(&c);

否则你在addBird中传输的参数是临时参数,但你将临时参数的地址赋予G :: b []