c++ - 为什么我的代码中出现 "use of undefined type"错误,当我包含它的 header 时?

标签 c++ class forward-declaration

我正在学习 C++,并尝试使用 Direct3D 编写一个简单的游戏。在我的游戏项目中,我在整个游戏中使用一个命名空间,名为 GameEngine。我的游戏逻辑包含在一个名为 Game 的主类中。 Game 类将具有输入管理器和对象管理器之类的成员变量。这些将是私有(private)成员,但我的 Game 类有一个公共(public)函数,它返回指向 InputManager 类的指针。这样,我可以告诉 InputManager 在程序的主 PeekMessage 循环内处理窗口消息。

这是我的主要消息循环...

// instanciate the game
GameEngine::Game game(windowRectangle.bottom, windowRectangle.right);

// initialize D3D
game.InitializeDirect3D(hWnd);
game.InitializePipeline();

// main game loop
while (true)
{
    // check for received event messages
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        bool handled = false;

        if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
        {
            handled = game.GetInputManager()->HandleMouseInput(&msg);
        }
        else if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
        {
            handled = game.GetInputManager()->HandledKeyboardInput(&msg);
        }
        else if (msg.message == WM_QUIT)
        {
            break;
        }

        if (handled == false)
        {
            TranslateMessage(&msg);
            DispatchMessageA(&msg);
        }
    }

    // render the current frame
    game.RenderFrame();
}

// tear down D3D
game.CleanDirect3D();

不过,当我调用 GetInputManager 时出现错误。它说我正在使用未定义的类型 InputManagerGetInputManager 函数返回指向 InputManager 的指针。在这个主消息循环所在的 Main.cpp 文件的顶部,我包含了包含 InputManager 定义的 header ,即 InputManager。 h.所以,我不太清楚为什么它说这是一个未定义的类型。

有人知道这个错误是怎么回事吗?我第一次尝试在其中一些头文件中使用前向声明,我想这可能与这些有关吗?

我在 Github 上粘贴了按文件组织的整个代码:https://gist.github.com/ryancole/5936795#file-main-cpp-L27

文件已正确命名,错误行在粘贴底部附近突出显示。

最佳答案

Game.h forward 在全局命名空间中声明了一个class InputManager ,但真正的InputManager类是在命名空间 GameEngine 中。

由于这两个声明位于不同的命名空间中,因此它们彼此独立,并且全局命名空间中的 InputManger 保持为不完整类型。要解决此问题,请将前向声明移至命名空间。

关于c++ - 为什么我的代码中出现 "use of undefined type"错误,当我包含它的 header 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17496200/

相关文章:

C++使用运算符重载将两个时间值相加

c++ - 如何管理不同类中原始指针和 unique_ptr 的混合使用? (异常(exception)?)

python - 最Python式的 super 父类和传递类变量的方法

c++ - 我可以用 C++ "forward declare"做什么?

clojure - Clojure 中的前向声明有哪些限制?为什么我不能在这个例子中使用 comp ?

c++ - 程序似乎跳过了 'if' 语句

c++ - QNetworkAccessManager 不发出信号

c++ - 具有 "aggressive"可变语义的 C 和 C++ 编译器

c# - 通过枚举匹配类

c++ - 未在此范围内声明“收银员”