Tablica obiektów w deklaracji klasy. Bez konstruktora domniemanego.

0

Cześć :)

Piszę sobie program i dostaję błąd:

brace-enclosed initializer used to initialize `PLAYER_SET'

Kod:

class GAME_SET
{ 
private:
    PLAYER_SET Player_set[4] = { {8, 20, CHARACTER_RED},
                                              {428, 20, CHARACTER_BLUE},
                                              {8, 343, CHARACTER_GREEN},
                                              {428, 343, CHARACTER_YELLOW}
                            };
}

konstruktor klasy PLAYER_SET:

explicit PLAYER_SET(int xx, int yy, int col = CHARACTER_RED); 

Dowiedziałem się już że błędem jest inicjalizacja obiektów klasy w deklaracji klasy. Podejrzewam że powinno być po prostu:

PLAYER_SET Player_set[4]; 

Tylko potem nie wiem gdzie mam zainicjalizować tą tablicę.

Dacie radę pomóc?
Dzięki :)

1
class GAME_SET
  { 
   private:
   static const PLAYER_SET Player_set[];
   static const unsigned Player_set_count;
  };
const PLAYER_SET GAME_SET::Player_set[]=
  {
   PLAYER_SET(8, 20, CHARACTER_RED),
   PLAYER_SET(428, 20, CHARACTER_BLUE),
   PLAYER_SET(8, 343, CHARACTER_GREEN),
   PLAYER_SET(428, 343, CHARACTER_YELLOW),
  };
const unsigned GAME_SET::Player_set_count=sizeof(GAME_SET::Player_set)/sizeof(*GAME_SET::Player_set);
0

O super :) bardzo dziękuję za odpowiedź. Pomogło. Wprawdzie nie mogłem zostawić const bo coś się pluł... ale czy takie tablice zawsze muszą być static? bo z tego co kojarzę to skoro są static są wspólne dla wszystkich obiektów danej klasy.

0

W C++11 już nie muszą.
W obecnie powszechnym standardzie C++ możesz jedynie dodawać dynamicznie.
Nie wywalaj const. Dodaj const w tych miejscach gdzie się pluło.

0

No to takiego bohomaza mi wywala:
In member function void GAME_SET::run()':| error: passing const PLAYER_SET' as this' argument of int PLAYER_SET::Get_X()' discards qualifiers
error: passing const PLAYER_SET' as this' argument of int PLAYER_SET::Get_Y()' discards qualifiers error: passing const PLAYER_SET' as this' argument of SDL_Surface* PLAYER_SET::Get_image()' discards qualifiers
== Build finished: 3 errors, 0 warnings ===

Pojawia się przy wywołaniu:

apply_surface(Player_set[i].Get_X(), Player_set[i].Get_Y(), Player_set[i].Get_image(), screen);

a deklaracja funkcji:

void apply_surface(int x, int y, SDL_Surface *co, SDL_Surface *cel, SDL_Rect *clip)
0

int PLAYER_SET::Get_X()const { ... }
int PLAYER_SET::Get_Y()const { ... }
Przecież te funkcje nie zmieniają żadnych składowych klasy PLAYER_SET i nie powinni.

0

Ehh xD Przepraszam ale po kolei bo za szybko i już się gubię:

class PLAYER_SET
{
public:
int Get_Color();
int Get_X() {return x;}
int Get_Y() {return y;} 
};

Błąd wywala tutaj

 
for (int i=0; i<4; i++)
        {
            apply_surface(Player_set[i].Get_X(), Player_set[i].Get_Y(), Player_set[i].Get_image(), screen);
        }

Funkcja apply_surface:

 void apply_surface(int x, int y, SDL_Surface *co, SDL_Surface *cel, SDL_Rect *clip)

No a błąd z build messages to już podałem wcześniej.

1
class PLAYER_SET
  {
   public:
   int Get_Color()const;
   int Get_X()const {return x;}
   int Get_Y()const {return y;} 
  };

int PLAYER_SET::Get_Color()const
  {
   ...
  }
0

Normalnie mam ochotę Cię przytulić :D dziękuję ^^

Dobra... wszystko poszło pięknie ładnie. Tylko że znalazł mi błęda którego już nawet debugger nie widzi i tylko windows wywala że musi zamknąć program (opcja: wystąpił problem z aplikacją i zostanie ona zamknięta). Z tego co gdzieś podsłuchałem to można wyświetlić jak się program skompilował czy coś? No bo jak mam duży projekt to takiego błędu ja nie potrafię już wyśledzić.

0

Gdzieś mażesz po pamięci, znajdź gdzie.

0

Znalazłem... chyba. Skopiowałem projekt, usuwałem po kolei pliki i znalazłem linijkę gdzie się walił. No własnie problem w tym że wali się w pliku

GAME_SET.h

class GAME_SET
{
private:
    static const PLAYER_SET Player_set;
} 

no i powiązanym z nim
GAME_SET.cpp

const PLAYER_SET GAME_SET::Player_set = PLAYER_SET(8, 20, CHARACTER_RED);

(nie wrzucam definicji tego do GAME_SET.h bo kompilator wyrzuca: multiple definition of `GAME_SET::Player_set' a ponadto wskazuje na linijki zupełnie innych plików w naprawdę dziwnych miejscach.

Nie wiem czy to ma związek z tym, że nie wrzuciłem linijki:

const unsigned GAME_SET::Player_set_count=sizeof(GAME_SET::Player_set)/sizeof(*GAME_SET::Player_set);

Przyznam się szczerze, średnio rozumiem po co mi Player_set_count... ale no i tak ostatecznie spróbowałem ją wrzucić to wyrzucał mi znowu:
error: no match for 'operator' in 'GAME_SET::Player_set'

W każdym razie, zrobiłem konstruktor domyślny dla PLAYER_SET. Wsadziłem tylko jeden obiekt a nie tablicę czterech. Zrobiłem go "zwykłym" bez tam const, static itd. I wtedy zadziałało wszystko. Masz pomysł co może być nie tak?

0

Skoro teraz to nie jest tablica, to po co Ci count? Wiesz, że wynosi 1. *GAME_SET::Player_set działało poprzednio, bo był to wskaźnik na pierwszy element tablicy.

Definicja statycznego składnika klasy powinna być w pliku źródłowym tej klasy.

Ty chcesz mieć jeden element, czy tablicę elementów? Ma być taka sama dla każdego obiektu tej klasy czy inna? Zmieniasz coś i sam za bardzo chyba nie wiesz, co robisz.

0

Idealnie by było gdybym miał tablicę z 4 obiektami klasy PLAYER_SET. Tylko są następujące problemy:

  1. Gdy mam deklarację w pliku GAME_SET.h i pod deklaracją klasy mam definicję obiektów Player_set[] oraz Player_set_count. Kompilator wywala błąd, że mam wielokrotną definicję tych obiektów pokazując na linijki kodu w innych plikach. Więc problem jest z połączeniem plików, starałem się go rozwiązać w ten sposób że definicję umieszczę w .cpp no i to akurat pomogło... poniekąd bo...

  2. ...gdy mam deklarację pliku w GAME_SET.h a definicję w GAME_SET.cpp to znowu Windows wywala wspomniany error a kompilator nic nie przeszkadza. Więc spróbowałem z 1 obiektem i wszystko działa dobrze.

Ale cóż... jestem chciwy i chcę mieć 4 obiekty klasy PLAYER_SET w klasie GAME_SET...

W tablicy chcę mieć 4 elementy, każdy element ma inne współrzędne inny kolor itd.

0

Ad. 1. Player_set[] oraz Player_set_count mają być w GAME_SET.cpp
Ad. 2. Jedyne wytłumaczenie - coś nie tak zrobiłeś

1 użytkowników online, w tym zalogowanych: 0, gości: 1