2016-08-26 20 views
1

私はクラスTeamとクラスBallを持っており、TeamというコンストラクタにPlayerという別のクラスのオブジェクトでいっぱいのベクターを作成します。だから私はクラスのボールでこのベクトルを使用したいと思いますが、extern(public)コンパイラとして定義しても、私のベクトルであるチームへの未定義の参照が残っていることがわかります。ここでコンストラクタで作成されたexternベクトル

#define TEAM_H 
#include <iostream> 
#include <vector> 
#include "Player.h" 

using namespace std; 
extern vector<Player> team; 
class Team { 
    public: 
     Team(); 

     void fillTeamVector(vector<Player>&); 

    private: 
     string teamName; 
     int faults; 
     int passes; 
     int goals; 

}; 

#endif // TEAM_H 

Team.cpp

#include "Team.h" 
#include <vector> 
#include <iostream> 
#include "Player.h" 
#include "Attacker.h" 
#include "Defender.h" 
#include "Ball.h" 

Team::Team() 
{ 
    extern vector<Player> team; 
    fillTeamVector(team); 
} 

void Team::fillTeamVector(vector<Player>& team){ 

// do stuff and store them on vector team 
} 

Team.cppとBall.cpp Team.hのコードをたどり、ここBall.hノートのコードを次のよう私は問題に影響を与えないすべての方法についてコメントしました。これにより

#ifndef BALL_H 
#define BALL_H 
#include "Player.h" 

class Ball 
{ 
    public: 
     Ball(); 
     Player* current; 
     Player* previous; 

     /*void setX_ball(int); 
     int getX_ball() const; 
     void setY_ball(int); 
     int getY_ball() const;*/ 
     void assign(); 
     //void changeCurrentToPrevious(); 
     //void changeNextToCurrent(Player*); 


    private: 
     int X_ball; 
     int Y_ball; 
}; 

#endif // BALL_H 

ここで私は新しい(それは正しくコンパイルされますプレイヤーの名前のチームのとは明らかに異なるベクトル)を作成する場合の方法で割り当てることBall.cppノートのコードがある

#include "Ball.h" 
#include "Team.h" 
#include "Player.h" 

extern vector<Player> team; 

Ball::Ball() 
: X_ball(2), 
    Y_ball(5) 
{ 
    current = NULL; 
    previous = NULL; 

} 

void Ball::assign(){ 
    //vector<Player> team; 
    int x; 
    int y; 
    x=(team[0].getX())-X_ball; 
    y=(team[0].getY())-Y_ball; 
    int min=x+y; 
    int k=0; 
    for (int i=1; i<team.size(); i++){ 
     x=(team[i].getX())-X_ball; 
     y=(team[i].getY())-Y_ball; 
     int sum=x+y; 
     if(sum<min){ 
      k=i; 
     } 
    } 
    current = &team[k]; 
} 
+3

あなたは*ベクトル変数を*宣言し続けますが、決して実際には決して定義しません。 –

+0

たとえ私がexternと入力したとしても、チーム。 Team.hの一般公開で同じエラーが発生する –

+0

@GerasimosRagavanis - マルチモジュールプログラムでグローバル変数を宣言し定義する方法を知っていますか?それは問題です。これは 'vector'とは関係ありません。それを 'int'に変更しても、同じ問題が残るでしょう。 – PaulMcKenzie

答えて

3

extern vector<Player> team; 

は、あなただけの変数を宣言します。

vector<Player> team; 

注定義でexternの欠如:

つのソースファイルでは、実際にに変数を定義する必要があります。

グローバル変数が必要なので、グローバルスコープでこれを行う必要があることにも注意してください。したがって、関数やクラス、名前空間の外で定義する必要があります。

+0

@GerasimosRagavanis関数内で実行する場合は、* local *変数を定義します。 *グローバルスコープ内で、関数の外で変数を定義する必要があります。 –

+0

@GerasimosRagavanisいいえ、あなたはクラス内の*メンバ変数*として宣言する必要があります。 –

関連する問題