在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
答案 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 []