2014-10-16 4 views
0

Я работаю над DirectX9 и создаю базовую систему ООП для обработки цикла рисования/обновления.Функция вызова вызова C++ без кругового включения

Так у меня есть 3 класса DirectXGame, D3DWindow, DemoGame : public DirectXGame так, как вы можете видеть DemoGame распространяется на DirectXGame класс. и демо-версия имеет экземпляр D3DWindow внутри него как окно.

Поэтому D3DWindow создает окно Windows и сортирует запуск DirectX внутри окна или полный просмотр.

поэтому я создал void(*drawEvent)(int dt) & void(*updateEvent)(int dt) и некоторые сеттеров (addDraw, addUpdate), что должно позволить DirectXGame к трубе методы в D3DWindow объект

void DirectXGame::createWindow(D3DWindow* wind, HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShowD) 
{ 
    this->d3dWindow = wind; 
    this->d3dWindow->create(hInstance, hPrevInstance, lpCmdLine, nCmdShowD); 
    /*below is lines 26 and 27 from errors*/ 
    this->d3dWindow->addDraw(this->draw); 
    this->d3dWindow->addUpdate(this->update); 
} 

однако все я получаю ошибки

C3867: 'DirectXGame::draw': function call missing argument list; use '&DirectXGame::draw' to create a pointer to member directxgame.cpp 26 
C3867: 'DirectXGame::update': function call missing argument list; use '&DirectXGame::update' to create a pointer to member directxgame.cpp 27 

я не может пройти & DirectXGame :: update или DemoGame :: update, поскольку они не будут иметь доступ к переменным-членам так как я могу заставить это работать.

сейчас я читал и находил такие вещи, как форвардеры, но чтобы сделать это, я должен отдать DirectXGame внутри D3DWindow, и это вызывает необходимость заголовка и последующей проблемы цикла включения.

Если вам нужно больше не читать код, пожалуйста, попросите его.

ответ

1

Вы можете использовать интерфейс с двумя чистыми абстрактными методами 'draw' и 'update'. D3DWindow содержит указатель на экземпляр этого интерфейса (ваш экземпляр DirectXGame) и называет 'draw' и 'update' на нем.

class IDirectXGame 
{ 
public: 
    virtual ~IDirectXGame() {} 
    virtual draw(int) = 0; 
    virtual update(int) = 0; 
}; 

Наследуйте интерфейс

class DirectXGame : public IDirectXGame 
{ 
    ... 
}; 

D3DWindow держит указатель на экземпляр, реализующего интерфейс.

class D3DWindow 
{ 
    ... 

    IDirectXGame *gameInstance; 
}; 

В 'createWindow' просто перейдите 'this' к окну 'gameInstance'.

+0

Знаете ли вы, что я даже не имел интерфейсов, я благодарю вас за это, однако это то, что я получаю от этого сейчас. 'Ошибка LNK2001: неразрешенный внешний символ" public: virtual void __thiscall IDirectXGame :: draw (int) " (? draw @ IDirectXGame @@ UAEXH @ Z) DirectXGame.obj' –

+0

Возможно, вы забыли «= 0» в конце интерфейса? '= 0' делает этот метод чистым виртуальным, это означает, что дочерние классы переопределяют его. – nonplus

+0

Dohhh .. был длинный день, пытаясь заставить эту работу –