2011-09-02 188 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

您的標題具有包含的循環依賴關係。根據您的需要,您可能會將其中一個更改爲前向聲明,或者您必須創建第三個標題,並在其中包含所需的通用代碼。