2017-09-14 70 views
0

我用C++制作游戏。我正在使用SFML。我有连接和共享/使用变量的game.h和game.cpp文件。在所有其他文件中使用1个变量的正确方法

我想在其他文件中使用其中一些变量。我试过例子:

extern int variable; 

它工作正常。问题是,当我试图让extern的:

sf::Texture hoverTexture; 
std::vector<sf::Sprite> Hover_Tiles; 
sf::Sprite hover; 

并使用其他CPP文件中的精灵/纹理。只是试图将我的代码分解成几个文件,以便于阅读。 所以我的问题是有可能使那些提到的精灵/纹理全局使用它们在其他文件中正确。什么是最好的方式来做到这一点。如果不可能,我应该怎么做?

如何在其他文件中使用这些精灵/纹理。如何连接它们?至少让我到某个地方。谢谢。

编辑:

毕竟包括在game.h

extern std::vector<sf::Sprite> Tiles; 
extern sf::Sprite tile; 

extern sf::Texture seaTexture; 
extern sf::Texture grassTexture; 
extern sf::Texture rockTexture; 
extern sf::Texture forestTexture; 

extern sf::Texture hoverTexture; 
extern std::vector<sf::Sprite> Hover_Tiles; 
extern sf::Sprite hover; 

extern sf::Texture hoverTexture2; 
extern std::vector<sf::Sprite> Hover_Tiles2; 
extern sf::Sprite hover2; 

extern sf::Texture houseTexture; 
extern std::vector<sf::Sprite> House_Tiles; 
extern sf::Sprite house; 

extern int map[20][10]; 

的顶部在其他文件map.cpp

#include "game.h" 
#include "map.h" 

#include "SFML\Graphics.hpp" 
#include <vector> 

std::vector<sf::Sprite> Tiles; 
sf::Sprite tile; 

sf::Texture seaTexture; 
sf::Texture grassTexture; 
sf::Texture rockTexture; 
sf::Texture forestTexture; 

sf::Texture hoverTexture; 
std::vector<sf::Sprite> Hover_Tiles; 
sf::Sprite hover; 

sf::Texture hoverTexture2; 
std::vector<sf::Sprite> Hover_Tiles2; 
sf::Sprite hover2; 

sf::Texture houseTexture; 
std::vector<sf::Sprite> House_Tiles; 
sf::Sprite house; 


int map[20][10] = 
{ 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } 
}; 

在我废了一样map.cpp函数首先在map.h中定义。该函数拥有一些在game.cpp中很好用的代码(如果我贴出的代码在game.h中)。我也有例外的问题抛出:

Exception thrown at 0x7749B2E3 (ntdll.dll) in App.exe: 0xC0000005: 
Access violation writing location 0x00000004. 

在map.cpp行:

sf::Texture seaTexture; 

我希望这个代码我张贴有助于修复问题。当我使用extern将这些精灵/纹理/变量转换为其他文件时,它不起作用,但其中一个(game.h和game.cpp)中的所有东西都很好。

+1

推荐添加任何错误信息,警告和(假设该方案建立,当然)当您运行的会发生什么观察到的行为程序。否则,我们会非常失明。还建议制作[mcve]。他们在指出问题时几乎总是非常有帮助。 – user4581301

+1

在我看来 - 最好的方法是不使用全局变量。传递参数。 –

+0

@ArtemyVysotsky你能举个例子吗? – Sadin97

回答

0

在声明extern变量之前,您需要包含lib头文件。否则,编译器不知道什么是Class。

otherfile.h

#ifndef OF_H_ 
#define OF_H_ 

#include <Texture.hpp> 
#include <Sprite.hpp> 
#include <vector> 

extern sf::Texture hoverTexture; 
extern std::vector<sf::Sprite> Hover_Tiles; 
extern sf::Sprite hover; 

#endif 

game.cpp

#include <game.h> 

sf::Texture hoverTexture; 
std::vector<sf::Sprite> Hover_Tiles; 
sf::Sprite hover; 
+0

我在声明extern变量之前包含了lib头文件。我明白那个。我编辑了我的第一篇文章并添加了一些代码,以帮助您更好地理解问题。 – Sadin97

相关问题