2017-09-14 16 views
0

私はC++でゲームを作っています。私はSFMLを使用しています。私は接続されている/変数を共有/使用してgame.hとgame.cppファイルがあります。他のすべてのファイルで1つの変数を使用する正しい方法

他のファイルでこれらの変数のいくつかを使いたいです。私は例を試した:

extern int variable; 

それはうまくいきます。

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

そして、他のcppファイル内のスプライト/テクスチャを使用します。私はこのEXTERNを作るしようとすると問題があります。コードを読みやすくするためにいくつかのファイルに分割しようとしています。 私の質問は、これらのスプライト/テクスチャを他のファイルで正しく使用できるようにすることです。それを行う最善の方法は何ですか?それができない場合は、どうすればいいのですか?

これらのスプライト/テクスチャを他のファイルで使用する方法。それらを接続する方法? 少なくとも私はどこかに向ける。ありがとう。

編集:

すべては私がvoid作っgame.h同じmap.cppで

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.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を使って他のファイルに転送すると、動作しませんが、1つ(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

関連する問題