给出以下两个头文件:
#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
AND
#ifndef WINDOW_HANDLER_H
#define WINDOW_HANDLER_H
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "event_handler.h"
class WindowHandler
{
public:
WindowHandler();
sf::Window m_app;
private:
EventHandler m_eventHandler;
};
#endif
我得到以下输出:
In file included from window_handler.h:6:0,
from main.cpp:3:
event_handler.h:13:29: error: expected ‘)’ before ‘&’ token
event_handler.h:15:2: error: ‘WindowHandler’ does not name a type
据我所知,我做的一切都很完美。我在这里错过了什么吗?
答案 0 :(得分:6)
你有一个循环依赖。
当window_handler.h
包含event_handler.h
时,您已定义WINDOW_HANDLER_H
,但实际上尚未达到定义类的位置。当event_handler.h
尝试包含window_handler.h
时,由于WINDOW_HANDLER_H
event_handler.h
如上所述,您需要通过移除window_handler.h
的包含并将其替换为class WindowHandler;
来转发{{1}}中的声明。
{{1}}
答案 1 :(得分:1)
在event_handler.h中,删除行
#include "window_handler.h"
并将其替换为
class WindowHandler;
这里的问题是您的包含列表中有一个循环。因此,由于包含保护,您将拥有一个尝试使用未定义的WindowHandler或未定义的EventHandler的文件。看看预处理器输出,这应该更有意义。
答案 2 :(得分:1)
您的标头具有包含的循环依赖关系。根据您的需要,您可以将其中一个更改为前向声明,或者您必须创建包含所需公共代码的第三个标头。