给定以下两个头文件:
#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和
#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据我所知,我一切都做得很好。我是不是漏掉了什么?
发布于 2011-09-02 12:33:02
你有一个循环依赖。
当window_handler.h包含event_handler.h时,您已经定义了WINDOW_HANDLER_H,但实际上还没有达到定义类的地步。当event_handler.h尝试包含window_handler.h时,由于WINDOW_HANDLER_H的原因,它没有包含
如前所述,您需要在event_handler.h中转发声明,方法是删除window_handler.h的include并将其替换为:
class WindowHandler;发布于 2011-09-02 12:29:46
在event_handler.h中,删除该行
#include "window_handler.h"并将其替换为
class WindowHandler;这里的问题是,您的包含列表中有一个循环。因此,由于包含保护,您将有一个试图使用未定义的WindowHandler或未定义的EventHandler的文件。看一下预处理器的输出,这应该更有意义。
发布于 2011-09-02 12:30:33
您的头文件具有包含的循环依赖项。根据您的需要,您可以将其中一个更改为转发声明,或者您必须创建第三个标头,其中包含所需的公共代码。
https://stackoverflow.com/questions/7279230
复制相似问题