私はクラス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];
}
あなたは*ベクトル変数を*宣言し続けますが、決して実際には決して定義しません。 –
たとえ私がexternと入力したとしても、チーム。 Team.hの一般公開で同じエラーが発生する –
@GerasimosRagavanis - マルチモジュールプログラムでグローバル変数を宣言し定義する方法を知っていますか?それは問題です。これは 'vector'とは関係ありません。それを 'int'に変更しても、同じ問題が残るでしょう。 – PaulMcKenzie