2012-02-24 3 views
0

Birdクラスには、ParrotとCrowの2つのクラスで実装される1つの仮想関数canFly()があります。 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

+0

'addBird()'が壊れています。パラメータを参照するために関数を変更してください。 – UmNyobe

+0

私はcanFly()の意味を理解できません。あなたはそれを説明できますか? – shengy

答えて

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"; 
} 

とメインで():

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

そうでなければ、あなたがaddBirdに転送するパラメータは一時的なものですしかし、一時的なパラメータのアドレスをG :: b []に返す

+0

gは配列へのポインタなので、まだコードは実行されません。 – Tim

+0

エラーは何ですか? – ciphor

+0

@Tim - それはポインタの配列であると思う。宣言の括弧の中には、それを明確にするものがあります。 –

関連する問題