Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][Allegro 5] Problemy ze zmienną statyczną.

Ostatnio zmodyfikowano 2014-07-28 19:55
Autor Wiadomość
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" );
C/C++
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
C/C++
#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_H
BlokKolidujacy.cpp
C/C++
#include "BlokKolidujacy.h"
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>

BlokKolidujacy::BlokKolidujacy( int PoczatkowyX, int PoczatkowyY )
{
    x = PoczatkowyX;
    y = PoczatkowyY;
}

BlokKolidujacy::~BlokKolidujacy()
{
    //dtor
}

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.
P-114475
pekfos
» 2014-07-27 19:19:11
Nadawaj wartości tym teksturom po zainiacjalizowaniu allegro.
P-114480
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.
P-114564
pekfos
» 2014-07-28 15:45:54
Nie. Zdefiniuj te składowe statyczne jak teraz, tylko nadaj im wartości po zainicjalizowaniu allegro.
P-114566
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ę.

C/C++
class Blok
{
private:
    ALLEGRO_BITMAP * tekstura() const;
};

C/C++
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.
P-114568
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.
P-114571
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'

C/C++
void BlokKolidujacy::RysujSie()
{
    al_draw_bitmap( BlokTekstura, x, y, 0 );
}

Wywołuję ją w main.
P-114573
pekfos
» 2014-07-28 16:11:42
Mieszasz jedno z drugim. Podaj aktualny kod.
P-114574
« 1 » 2
  Strona 1 z 2 Następna strona