2014-05-05 84 views
-2

在我的代碼中,我創建了兩個類,都有單獨的頭文件和類文件。標題A不能識別標題B?

所以在我的「player.h」頭,我有:

#ifndef PLAYER_H 
#define PLAYER_H 

#include "timer.h" 
#include "funcs.h" 

enum state{IDLE, RUN, JUMPRISE, JUMPFALL}; 

class Player 
{ 
public: 
    Player(SDL_Renderer* renderer, SDL_Texture* charSheet, int x, int y, int movespeed, SDL_Rect dimensions); 
    void show(Timer animTimer); 
    void handle(const Uint8* keydown, SDL_Rect* rex, int numRex); 
    int getX(); 
    int getY(); 

    ~Player(); 

private: 
    SDL_Renderer* m_renderer; 
    SDL_Texture* m_charSheet; 
    SDL_Rect m_coords; 
    int m_movespeed; 
    bool m_direction; 

    state animState; 

    SDL_Rect anim_left_run_clip[8]; 
    SDL_Rect anim_left_idle_clip[8]; 
    SDL_Rect anim_left_jumprise_clip[8]; 
    SDL_Rect anim_left_jumpfall_clip[8]; 
    SDL_Rect anim_right_run_clip[8]; 
    SDL_Rect anim_right_idle_clip[8]; 
    SDL_Rect anim_right_jumprise_clip[8]; 
    SDL_Rect anim_right_jumpfall_clip[8]; 
}; 

#endif // PLAYER_H 

我每次編譯,我得到一個錯誤說「錯誤:計時器還沒有被宣佈爲」在包含行:

void show(Timer animTimer) 

我的「timer.h」文件沒有特別之處,我也不相信問題出在那裏。事情我已經檢查了:

  • 「定時器」與「計時器」
  • 包括「timer.h」在「player.h」頭文件
  • 正確目錄的頂部,「計時器.h「文件

要麼我在某處忽略了一些明顯的錯誤,要麼我犯了一些我沒有意識到的編碼錯誤。

+4

我懷疑一個循環'#include'問題:'player.h包含'timer.h','timer.h'包含'player.h'。沒有標題A包含標題B,也有標題B包含標題A.這些循環依賴關係通常不起作用。 –

+2

很難說,看不到timer.h – fstd

+0

是的,請顯示'timer.h'的實際外觀。 –

回答

1

很可能,在timer.h中,你是#including player.h,然後#includes timer.h也是。但是由於標頭守衛,timer.h的內容會被忽略。結果是player.h在timer.h之前被解析。最終的結果是你不能以這種方式相互依賴於彼此的實現。你需要決定哪一個是另一個使用的更基本的。

如果在標題中,A使用B,但B僅使用指向A的指針,則可以先放置B,然後使用類似的語句轉發聲明A.

class A; 

在這種情況下B.h不包括A.h全班。