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

Zapętlone includowanie bibliotek -> Forward declaration potrzebny, ale powodujący błąd kompilacji.

Ostatnio zmodyfikowano 2018-12-03 16:19
Autor Wiadomość
rafallauterbach
Temat założony przez niniejszego użytkownika
Zapętlone includowanie bibliotek -> Forward declaration potrzebny, ale powodujący błąd kompilacji.
» 2018-12-03 13:27:40
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 :
C/C++
#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;
   
    //actual
    //draw
};

#endif // SCENE_H
Object.h :
C/C++
#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 // OBJECT_H
Button.h :
C/C++
#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 // BUTTON_H
P-173087
pekfos
» 2018-12-03 16:13:12
Dziedziczenie wymaga kompletnego typu, utworzenie wskaźnika nie. Wywołanie metody na wskaźniku wymaga kompletnego typu, ale to będzie już w pliku CPP, więc nie ma znaczenia. Między tymi trzema plikami nagłówkowymi potrzeba tylko jednego #include. Dla wygody możesz dodać więcej, ale bez wprowadzania cykli.

Forward deklaracja (przepraszam za nieumiejętność przetłumaczenia)
Po prostu "deklaracja".
P-173088
rafallauterbach
Temat założony przez niniejszego użytkownika
» 2018-12-03 16:19:02
Dzięki za wskazówkę!
Naprawiłem już problem, w Scene.h includuję tylko Button.h, w Button.h Object.h, a w Object.h nie includuję niczego i deklaruję tylko Scene.

Po tej modyfikacji miałem błąd w Button.cpp, ale tam już normalnie zaincludowałem Scene.h i wszystko działa.
P-173089
« 1 »
  Strona 1 z 1