Mam klasę Graphics
i chciałbym aby jej zawartość zależała od użytych nagłówków. Czyli jak np. zrobię #include "2D.h"
to w klasie powinna się pojawić funkcja tam zdefiniowana. Póki co mam to zrobione tak:
Graphics.h
struct FrameBuffer; //strukturka zawierająca informacje o uchwycie okna, DC, rozdzielczości itd., jej pełna definicja zalega w nagłówku Display.h.
//Jest on podlinkowany w Graphics.cpp, 2D.cpp i 3D.cpp
#if defined(G2D_H) and defined(G3D_H)
#include "2D.h"
#include "3D.h"
class GraphicsBase : public Graphics2D, public Graphics3D
{
protected:
GraphicsBase(FrameBuffer& rBuffer) :
Graphics2D(rBuffer),
Graphics3D(rBuffer)
{};
};
#elif defined(G2D_H)
#include "2D.h"
class GraphicsBase : public Graphics2D
{
protected:
GraphicsBase(FrameBuffer& rBuffer) :
Graphics2D(rBuffer)
{};
};
#elif defined(G3D_H)
#include "3D.h"
class GraphicsBase : public Graphics3D
{
protected:
GraphicsBase(FrameBuffer& rBuffer) :
Graphics3D(rBuffer)
{};
};
#else
class GraphicsBase
{
protected:
GraphicsBase(FrameBuffer& rBuffer)
{};
};
#endif
class Graphics : public GraphicsBase //Klasa właściwa
{
private:
FrameBuffer& Buffer;
public:
Graphics(FrameBuffer& rBuffer);
void Fill(unsigned int uiColor);
};
2D.h
#define G2D_H
struct FrameBuffer;
class Graphics2D
{
protected:
FrameBuffer& Buffer;
public:
Graphics2D(FrameBuffer& rBuffer);
void Kwadrat();
}
2D.cpp
#include "2D.h"
#include "Display.h" //Tu jest definicja structa FrameBuffer
Graphics2D::Graphics2D(FrameBuffer& rBuffer) :
Buffer(rBuffer)
{}
void Graphics2D::Kwadrat()
{}
3D.h
#define G3D_H
struct FrameBuffer;
class Graphics3D
{
protected:
FrameBuffer& Buffer;
public:
Graphics3D(FrameBuffer& rBuffer);
void Szescian();
}
3D.cpp
#include "3D.h"
#include "Display.h" //Tu jest definicja structa FrameBuffer
Graphics3D::Graphics2D(FrameBuffer& rBuffer) :
Buffer(rBuffer)
{}
void Graphics3D::Szescian()
{}
Core.h
#include "Graphics.h"
class Core //Klasa główna, agregator dla pozostałych
{
public:
Graphics GTX;
}
Main.cpp
#include "2D.h"
#include "3D.h"
#include "Core.h"
Teoretycznie działa, bo mogę sobie wywołać np. GTX.Kwadrat()
albo GTX.Szescian
, wszystko się uruchamia i kompiluje, ale potem program się sypie. Nie odpowiada na komendy, nie działają klawisze, a po kilku sekundach się zawiesza. Co dziwne, jeżeli w Graphics.h
podlinkuje 2D.h
i 3D.h
bezwarunkowo, to wszystko działa normalnie. Z warunkiem (po wykryciu definicji 2D_H
i 3D_H
) niestety nie.
Ktoś ma jakiś pomysł co robię źle?
Graphics2D(rBuffer)
lubGraphics3D(rBuffer)
z poziomuGraphicsBase
. Jeżeli tego nie robię, wszystko śmiga.Szalony ProgramistaSzalony ProgramistaSzalony Programista