在一个代码文件中使用头文件,反之亦然?

时间:2015-09-04 12:58:54

标签: c++

所以我遇到了一些问题(两个问题,但他们彼此无关)。

我有两个标题如下:

Game.h

#ifndef INIT_GAME_H
#define INIT_GAME_H

#include <deps/deps.h>

#include <handlers/RenderHandler.h>

class Game {
    private:
        RenderHandler* renderHandler; /* <-- This is line 32 in my actual header */

    public:
        Game() {};
        ~Game() {};

        int initialise();
        void handleEvents();
        void update();
        void render();
        void clean();
}; // class Game
#endif // INIT_GAME_H

RenderHandler.h

#ifndef HANDLERS_RENDERHANDLER_H
#define HANDLERS_RENDERHANDLER_H

#include <init/Game.h>

class RenderHandler {
    private:
        Game* game;

    public:
        RenderHandler() {};
        ~RenderHandler() {};

        void initialise(Game* game);
        void render();
}; // class RenderHandler
#endif // HANDLERS_RENDERHANDLER_H

但是上面的代码在编译过程中给出了一个错误:

game.h(32): error C2143: syntax error: missing ';' before '*'
game.h(32): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
game.h(32): error C2238: unexpected token(s) preceding ';'

正如您可能已经猜到的那样,我试图将Game的实例存储在RenderHandler中,反之亦然。我可能完全以错误的方式做到这一点,但我无法理解为什么它不起作用。

此外,所有;都位于我的头文件中第32行之前的正确位置。

编辑:

执行建议的转发声明后,我收到以下错误(现在在RenderHandler.cpp文件中)。

Error: pointer to incomplete class type is not allowed

这是我的代码文件的样子

RenderHandler.cpp

#include <handlers/RenderHandler.cpp>

void RenderHandler::initialise(Game* game) {
    this->game = game;
}

void RenderHandler::render() {
    glfwSwapBuffers(game->getPrimaryWindow());
}

1 个答案:

答案 0 :(得分:5)

使用前瞻声明:

#ifndef HANDLERS_RENDERHANDLER_H
#define HANDLERS_RENDERHANDLER_H

// FW declaration of Game
class Game;

class RenderHandler {
    private:
        Game* game;

    public:
        RenderHandler() {};
        ~RenderHandler() {};

        void initialise(Game* game);
        void render();
}; // class RenderHandler
#endif // HANDLERS_RENDERHANDLER_H