2011-09-02 145 views
0

鉴于以下两个头文件:C++编译器问题

#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 

据我知道,不过,我一切都很好。我在这里错过了什么吗?

回答

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; 
+0

谢谢。所有奖励积分! – zeboidlund

1

在event_handler.h,删除行

#include "window_handler.h" 

class WindowHandler; 

取代它这里的问题是,你有你的包括列表循环。因此,由于包含警卫,您将拥有一个试图使用未定义的WindowHandler或未定义的EventHandler的文件。看看预处理器输出,这应该更有意义。

1

您的标题具有包含的循环依赖关系。根据您的需要,您可能会将其中一个更改为前向声明,或者您必须创建第三个标题,并在其中包含所需的通用代码。