Zapętlone includowanie bibliotek -> Forward declaration potrzebny, ale powodujący błąd kompilacji.
Witam, od razu zaznaczę, że prawdopodobnie wypracowałem zły styl programowania, ale nie mogłem wymyślić lepszego sposobu.
Gdy potrzebowałem zaincludować "Scene.h" w "Object.h" i "Object.h" w "Scene.h" nie mogłem tego zrobić, mam header guardy, więc nie mam problemu z nieskończenie zapętlonym includowaniem, ale miałem problem z tym, że klasa Object była nieznana dla klasy Scene, gdy includowałem Scene.h na górze pliku Object.h i odwrotnie. Rozwiązałem ten problem za pomocą forward deklaracji (w Object.h najpierw deklaruję istnienie klasy Object, a dopiero potem includuję Scene.h i odwrotnie.
Problem pojawił się, gdy dodałem klasę Button dziedziczącą Object.
Forward deklaracja (przepraszam za nieumiejętność przetłumaczenia) w Object jest mi teraz potrzebna i zabroniona zarazem. Jeśli ją usunę w Scene.h Object będzie niezadeklarowany, a używam wektora z Object'ami, z kolei jeśli wrzucę forward deklarację, to Button skarży się na niezaimpoementowaną klasę, z której każę mu dziedziczyć. Próbowałem w różne sposoby przekładać includy i forward deklaracje, ale żadne ułożenie mi nie działa, więc myślę, że po prostu nie powinienem programować w tym stylu w pierwszym miejscu.
Prosiłbym o poradę jak ułożyć to w sensowną całość.
Być może powinienem wyrzucić coś poza header guardy, też próbowałem różnych kombinacji. Raczej rozumiem jak to wszystko działa, ale pogubiłem się w tym.
Obecna wersja jest trochę "losowa" bo już pod koniec mojej cierpliwości próbowałem po prostu losowo przestawiać includy i deklaracje.
Scene.h :
#ifndef SCENE_H
#define SCENE_H
class Scene;
#include "Object.h"
#include "Button.h"
class Object;
class Scene
{
public:
Scene();
virtual ~Scene();
void setBackground( Texture * );
void addObject( Object * );
static void load( Scene * );
static void draw_scene();
static void click_event( unsigned int, unsigned int );
void draw_objects();
std::vector < Button *> buttons;
protected:
private:
Texture * tBackground;
std::vector < Object *> objects;
static Scene * actual;
};
#endif
Object.h :
#ifndef OBJECT_H
#define OBJECT_H
#include "Texture.h"
#include "Scene.h"
class Object
{
public:
Object( Scene * );
virtual ~Object();
void set_texture( Texture * );
void set_overlay( Texture * );
void set_placement( SDL_Rect );
void set_placement( SDL_Point );
void resetWH();
bool is_clicked( int, int );
void draw( SDL_Renderer * );
protected:
private:
Texture * texture;
Texture * overlay;
SDL_Rect placement;
};
#endif
Button.h :
#ifndef BUTTON_H
#define BUTTON_H
class Button;
#include "Object.h"
class Button
: public Object
{
public:
Button( Scene * );
virtual ~Button();
virtual void onclick() = 0;
protected:
private:
};
#endif