2016-08-26 3 views
1

Ich habe eine Klasse Team und eine Klasse Ball und ich erstelle einen Vektor im Konstruktor von Team, die mit Objekten einer anderen Klasse namens Player gefüllt ist. Also möchte ich diesen Vektor in der Klasse Ball verwenden, obwohl ich ihn als extern (öffentlich) Compiler definiere, sagt mir immer wieder, dass ich einen undefinierten Verweis auf das Team habe, das mein Vektor ist. Hier folgt der Code von Team.cpp und Ball.cpp Team.hExterner Vektor erstellt in Konstruktor

#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 
} 

Und hier folgt der Code für Ball.h beachten Sie, dass Ich habe alle Methoden kommentiert, die das Problem nicht beeinflussen.

#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 

Hier ist der Code für Ball.cpp beachten Sie, dass in Verfahren vergeben werden, wenn ich ein neues (und natürlich eine andere Vektor-Spieler namens Team wird es richtig kompilieren) erstellen

#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

Sie einfach weiter * deklarieren * die Vektorvariable, aber Sie definieren * es * nirgendwo. –

+0

Auch wenn ich extern team eingeben; in der Öffentlichkeit von Team.h produziert es den gleichen Fehler –

+0

@GerasimosRagavanis - Wissen Sie, wie globale Variablen in einem Multi-Modul-Programm zu deklarieren und zu definieren? Das ist das Problem - es hat nichts mit "Vektor" zu tun. Ändern Sie es in "int", und Sie hätten immer noch das gleiche Problem. – PaulMcKenzie

Antwort

3

Dadurch

extern vector<Player> team; 

Sie nur erklären die Variable.

In einer Quelldatei müssen Sie tatsächlich definieren die Variable:

vector<Player> team; 

Hinweis der Mangel an extern in der Definition.

Beachten Sie auch, dass dies im globalen Bereich durchgeführt werden muss, da Sie eine globale Variable möchten. Daher muss es außerhalb von Funktionen oder Klassen oder Namespaces definiert werden.

+0

@GerasimosRagavanis Wenn Sie es innerhalb einer Funktion tun, dann definieren Sie eine * lokale * Variable. Sie müssen die Variable im Bereich * global * außerhalb von Funktionen definieren. –

+0

@GerasimosRagavanis Nein, Sie sollten es als eine * Member-Variable * innerhalb der Klasse deklarieren. –

Verwandte Themen