C++ C++;编译器问题

C++ C++;编译器问题,c++,compiler-errors,C++,Compiler Errors,给定以下两个头文件: #ifndef EVENT_HANDLER_H #define EVENT_HANDLER_H #include <SFML/Window.hpp> #include <SFML/Window/Event.hpp> #include "window_handler.h" class EventHandler { public: EventHandler(WindowHandler & classOwner); Windo

给定以下两个头文件:

#ifndef EVENT_HANDLER_H
#define EVENT_HANDLER_H

#include <SFML/Window.hpp>
#include <SFML/Window/Event.hpp>
#include "window_handler.h"

class EventHandler
{
public:
    EventHandler(WindowHandler & classOwner);

    WindowHandler * m_windowHandler;

private:
    bool m_leftKeyDown;
    bool m_rightKeyDown;
    bool m_upKeyDown;
    bool m_downKeyDown;

    unsigned int m_mouseX;
    unsigned int m_mouseY;

};

#endif

但据我所知,我一切都做得很好。我在这里遗漏了什么吗?

在event\u handler.h中,删除该行

#include "window_handler.h"
并将其替换为

class WindowHandler;
class WindowHandler;

这里的问题是,您的包含列表中有一个循环。因此,由于有include-guards,您将有一个试图使用未定义的WindowHandler的文件,或者有一个未定义的EventHandler。看看预处理器的输出,这应该更有意义。

您的标题具有循环的includes依赖关系。根据您的需要,您可能可以将其中一个更改为转发声明,或者您必须创建第三个标头,其中包含所需的公共代码。

您有一个循环依赖项

window\u handler.h
包含
事件\u handler.h
时,您已经定义了
window\u handler\u h
,但实际上还没有到达定义类的点。当
event\u handler.h
试图包含
window\u handler.h
时,由于
window\u handler\u h

如上所述,您需要在
事件处理程序.h
中向前声明,方法是删除
窗口处理程序.h的include,并将其替换为:

class WindowHandler;
class WindowHandler;