Sprite.hpp:
|
C-/C++-Quelltext
|
1
|
extern sf::Texture TicTacToe_Texture;
|
irgendeine *.cpp deiner Wahl:
|
C-/C++-Quelltext
|
1
|
sf::Texture TicTacToe_Texture;
|
Wie schon erwähnt ist hier eine globale Variable nicht besonders sinnvoll.
Um die Lösung zu finden, muss du dich nur einmal in deinen Compiler/Linker versetzen. Der Compiler sieht immer nur eine *.cpp, die er in eine Objektdatei übersetzt. Der Linker fügt dann alles zu deiner *.exe zusammen.
Ohne extern in der hpp würde folgendes passieren:
-Compiler fängt mit Main.cpp an.
-Die Sprite.hpp wird inkludiert und eingefügt. Darin findet sich die globale Variable, sie wird also angelegt.
-Das gleiche mit der Sprite.cpp, da diese auch Sprite.hpp einbindet wird die Variable noch einmal in der Mainobjektdatei angelegt.
-Linker fängt an, die Objektdateien zusammenzufügen. In beiden Dateien findet sich nun eine globale Variable mit dem gleichen Namen. Das geht nicht, der Linker weiß nicht, was er tun soll und bricht ab.
Mit extern, aber ohne Definition in einer cpp:
-Compiler fängt wieder in der Main.cpp an, stößt auf das extern in der Sprite.hpp; Extern heißt soviel wie: Es gibt eine Variable mit diesem Namen woanders, die sollst du benutzen. Es wird keine Variable angelegt, sondern sich darauf verlassen, dass der Linker später dann aus einer anderen Objektdatei eine Variable mit passendem Namen hat, die dann benutzt wird.
-Das gleiche in der Sprite.cpp. Es wird wieder keine Variable angelegt, sondern nur das Einfügen auf den Linker geschoben.
-Der Linker fängt an. Da aber ALLE Objektdateien nun auf diese eine Variable verweisen, sie aber von KEINER angelegt wird, existiert die Variable, auf die verwiesen wird nicht. Der Linker weiß wieder nicht, was er tun soll und bricht ab.
Mit der Lösung passiert folgendes:
-Der Compiler fängt wieder an, stößt zweimal auf das extern und fügt wieder einen Platzhalter für den Linker ein. Die eine Objektdatei legt die Variable tatsächlich an (Wegen dem fehlendem extern in der *.cpp). Der Linker hat nun EINE passende Variable, die er überall einfügen kann, alles ist gut.
-???
-Profit
Nur so mal als Erklärung
. Du solltest aber wirklich dringend mal darüber nachdenken, die Variable in eine Klasse zu verschieben, denn 1. willst du sicher mehr als ein Sprite anlegen und 2. hat man dann solche Scherereien mit extern usw. nicht mehr.