frogi16 Temat założony przez niniejszego użytkownika |
[C++][Allegro 5] Problemy ze zmienną statyczną. » 2014-07-27 18:11:13 Od kilku godzin męczę się z klasą odpowiadającą za bloki, głównym problemem jest zmienna statyczna. Próbowałem różnych możliwości jej użycia i mam różne błędy. Doszedłem ostatecznie do takiej wersji programu (fragmenty których dotyczy błąd): Main.cpp #include <BlokKolidujacy.h> ALLEGRO_BITMAP * BlokKolidujacy::BlokTekstura = al_load_bitmap( "Bloczek.png" ); if( !BlokKolidujacy::BlokTekstura ) { al_show_native_message_box( Okno, "Błąd", "Błąd!", "Błąd wczytania tekstury Blok Kolidujący!", NULL, ALLEGRO_MESSAGEBOX_ERROR ); } BlokKolidujacy.h #ifndef BLOKKOLIDUJACY_H #define BLOKKOLIDUJACY_H #include <allegro5/allegro.h> #include <allegro5/allegro_image.h>
class BlokKolidujacy { public: static ALLEGRO_BITMAP * BlokTekstura; BlokKolidujacy( int PoczatkowyX, int PoczatkowyY ); ~BlokKolidujacy(); void RysujSie(); protected: private: int x; int y; }; #endif
BlokKolidujacy.cpp #include "BlokKolidujacy.h" #include <allegro5/allegro.h> #include <allegro5/allegro_image.h>
BlokKolidujacy::BlokKolidujacy( int PoczatkowyX, int PoczatkowyY ) { x = PoczatkowyX; y = PoczatkowyY; }
BlokKolidujacy::~BlokKolidujacy() { }
void BlokKolidujacy::RysujSie() { al_draw_bitmap( BlokTekstura, x, y, 0 ); } Błąd którego kod zacytowałem się wyświetla mimo istnienia pliku "Bloczek.png". Zaznaczam że wczytuję wiele bitmap i działają wszystkie oprócz tych do zmiennych statycznych. (gdybym usunął kod odpowiadający za ten błąd to cały program by się scrashował) Pozdrawiam i z góry dziękuję za pomoc. |
|
pekfos |
» 2014-07-27 19:19:11 Nadawaj wartości tym teksturom po zainiacjalizowaniu allegro. |
|
frogi16 Temat założony przez niniejszego użytkownika |
» 2014-07-28 15:27:41 Z tego co doczytałem o tym to muszę zdefiniować tą zmienną poza jakąkolwiek funkcją. Jednocześnie najpierw muszę odpalić Allegro. Czyli jak to mam zrobić? np.
deklaracje zmiennych main z odpalaniem Allegro definicja zmiennej statycznej funkcja w której będzie to dotychczas miałem w main
Będzie to działało? Nie wygląda za dobrze. |
|
pekfos |
» 2014-07-28 15:45:54 Nie. Zdefiniuj te składowe statyczne jak teraz, tylko nadaj im wartości po zainicjalizowaniu allegro. |
|
Monika90 |
» 2014-07-28 15:49:45 zmienne globalne i statyczne w klasach są inizjalizowane zanim zacznie się wykonywać main. w twoim przypadku można (chyba) by temu zaradzić opakowując zmienną w funkcję. class Blok { private: ALLEGRO_BITMAP * tekstura() const; };
ALLEGRO_BITMAP * Blok::tekstura() const { static ALLEGRO_BITMAP * tex = load_texture( "blok.png" ); return tex; }
czy jakoś tak. Wtedy tekstura będzie załadowana przy pierwszym wywołaniu funkcji Blok::tekstura(), co miejmy nadzieję nastąpi już po inicjalizacji allegro w main. |
|
frogi16 Temat założony przez niniejszego użytkownika |
» 2014-07-28 15:53:47 Tak, ale nie mogę jej zdefiniować w main bo wysypuje błąd error: invalid use of qualified-name 'BlokKolidujacy::BlokTekstura' Z tego co znalazłem na necie dowiedziałem się że cytuję: "You've declared the static members fine, but not defined them anywhere. Basically what you've said "there exists some static member", but never set aside some memory for it, you need: int A::x = 100; Somewhere outside the class and not inside main." Wnioskuję z tego że nie mogę zdefiniować jej w main a jednocześnie muszę przed definicją zainicjalizować Allegro. EDIT: UP. O właśnie, wypróbuję to. |
|
frogi16 Temat założony przez niniejszego użytkownika |
» 2014-07-28 16:03:01 Ten element działa, ale mam identyczny problem w klasie BlokKolidujacy (tej samej która zawiera BlokTekstura): undefined reference to `BlokKolidujacy::BlokTekstura' void BlokKolidujacy::RysujSie() { al_draw_bitmap( BlokTekstura, x, y, 0 ); } Wywołuję ją w main. |
|
pekfos |
» 2014-07-28 16:11:42 Mieszasz jedno z drugim. Podaj aktualny kod. |
|
« 1 » 2 |