2012-02-24 57 views
0

在Bird類中,有一個虛函數canFly(),它在兩個類中實現:Parrot和Crow。 G是一個全球類,它記得沒有。 (即烏鴉或鸚鵡),然後printBirds()打印鳥類的飛行能力。由於未定義的引用引起的C++程序錯誤

但由於未定義的引用,我收到了一些錯誤。有人可以解釋這一點。爲什麼會出現這些錯誤以及如何糾正程序以消除錯誤。

#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

也許是因爲b從來沒有初始化? – Tim 2012-02-24 08:34:39

+0

'addBird()'壞了。改變函數以參考爲參數。 – UmNyobe 2012-02-24 08:38:50

+0

我不明白'canFly()'的含義,你能解釋一下嗎? – shengy 2012-02-24 08:41:26

回答

6

摹:: 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 []

+0

仍然代碼不會運行,因爲g是一個指向數組的指針,對吧? – Tim 2012-02-24 08:37:05

+0

現在有什麼錯誤? – ciphor 2012-02-24 08:40:19

+0

@Tim - 我認爲這是一個指針數組。宣言中的一些括號將澄清這一點。 – 2012-02-24 08:42:47