Zmienna dostępna w każdym pliku nagłówkowym
Ostatnio zmodyfikowano 2012-12-09 21:02
sinoo Temat założony przez niniejszego użytkownika |
Zmienna dostępna w każdym pliku nagłówkowym » 2012-12-08 22:36:26 Witam, moje pytanie - jak w temacie - jak stworzyć zmienną, aby była dostępna w każdym pliku nagłówkowym? Próbowałem już stworzyć globalną w jednym z plików nagłówkowych, ale taka zmienna jest dostępna jedynie w tym samym jednym pliku nagłówkowym i pliku głównym(*.cpp). |
|
Mrovqa |
» 2012-12-08 22:38:56 extern int var;
extern int var;
int var = 69;
Musisz ją zdefiniować w jednym z plików *.cpp (tylko tam możesz zmienną inicjalizować!), a w plikach nagłówkowych zamieszczasz tylko deklaracje zmiennych. |
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-12-08 22:52:29 Jeżeli chodzi o użycie w kilku plikach nagłówkowych to działa, ale wywala mi takie dziwne błędy: 1>------ Build started: Project: SFML_Game1, Configuration: Debug Win32 ------ 1> main.cpp 1>main.obj : error LNK2001: unresolved external symbol "class sf::RenderWindow GameApp" (?GameApp@@3VRenderWindow@sf@@A) 1>E:\Documents and Settings\SysOp\Moje dokumenty\Visual Studio 2010\Projects\SFML_Game1\Debug\SFML_Game1.exe : fatal error LNK1120: 1 unresolved externals ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== extern użyłem właśnie do sf::RenderWindow GameApp Dla rozjaśnienia oto kod:
#include <SFML/Graphics.hpp>
#include "Game1.h" #include "Events.h"
int main() { sf::RenderWindow GameApp( sf::VideoMode( 800, 600, 32 ), "SFML Game1" ); Game1 Game; Game.onStart(); while( GameApp.IsOpened() ) { GameEvent(); Game.Update(); Game.Draw(); } return 0; }
#ifndef Game1_h #define Game1_h
#include <SFML\Graphics.hpp> #include "Events.h"
extern sf::RenderWindow GameApp;
class Game1 { public: void onStart() { } void Update() { } void Draw() { GameApp.Clear(); GameApp.Display(); } void Exit() { } };
#endif
#ifndef Events_h #define Events_h
#include <SFML/Graphics.hpp> #include "Game1.h"
sf::Event Event; extern sf::RenderWindow GameApp;
void GameEvent() { while( GameApp.GetEvent( Event ) ) { if( Event.Type == sf::Event::Closed ) GameApp.Close(); } }
#endif
|
|
Mrovqa |
» 2012-12-09 14:25:45 Zauważ, iż sf::RenderWindow GameApp nie jest zmienna globalną. |
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-12-09 15:28:58 Wstawiłem zmienną sf::RenderWindow GameApp oraz Game1 Game jako zmienną globalną w ten sposób: #include <SFML/Graphics.hpp>
#include "Game1.h" #include "Events.h"
sf::RenderWindow GameApp( sf::VideoMode( 800, 600, 32 ), "SFML Game1" ); Game1 Game;
int main() { Game.onStart(); while( GameApp.IsOpened() ) { GameEvent(); Game.Update(); Game.Draw(); } return 0; } i wywala błędy: 1>------ Build started: Project: SFML_Game1, Configuration: Debug Win32 ------ 1> main.cpp 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\events.h(9): error C2146: syntax error : missing ';' before identifier 'Game' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\events.h(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\events.h(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\events.h(16): error C2228: left of '.Exit' must have class/struct/union 1> type is 'int' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(7): error C2146: syntax error : missing ';' before identifier 'Game' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(7): error C2086: 'int Game' : redefinition 1> e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\events.h(9) : see declaration of 'Game' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(11): error C2228: left of '.onStart' must have class/struct/union 1> type is 'int' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(16): error C2228: left of '.Update' must have class/struct/union 1> type is 'int' 1>e:\documents and settings\sysop\moje dokumenty\visual studio 2010\projects\sfml_game1\sfml_game1\main.cpp(17): error C2228: left of '.Draw' must have class/struct/union 1> type is 'int' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Nie mam pojęcia o co chodzi. |
|
Admixior |
» 2012-12-09 15:50:27 Zrąbałeś coś w pliku events.h (wystarczy przeczytać po ludzku logi). Nie wstawiłeś gdzieś średnika... (być może po definicji klasy, ale nie wiem w każdym bądź razie) brak średnika jest gdzieś tuż przed linijką z błędem (kliknij 2 razy na pierwszy błąd) |
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-12-09 21:02:35 Nic nie zwaliłem - jeżeli chodzi o średnik. Na pewno nie brakuje go nigdzie. Z resztą sprawdź sam - wysłałem wcześniej cały kod(plik *.cpp i pliki nagłówkowe). |
|
« 1 » |