2011-04-12 79 views
2

好了,這就是我的錯誤:「敵人」沒有在這個scope.The錯誤聲明是在map.h文件,即使map.h包括enemy.h如圖'Enemy'沒有在這個範圍內聲明?

#ifndef MAP_H_INCLUDED 
#define MAP_H_INCLUDED 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

#include "enemy.h" 

#define MAX_TILE_TYPES 20 

using namespace std; 

class Map{ 
     public: 
     Map(); 
     void loadFile(string filename); 
     int** tile; 
     int** ftile; 
     bool solid[MAX_TILE_TYPES]; 
     int width; 
     int height; 
     int tileSize; 

     vector<Enemy> enemies; 

}; 

#endif // MAP_H_INCLUDED 

這裏是enemy.h

#ifndef ENEMY_H_INCLUDED 
#define ENEMY_H_INCLUDED 

#include "global.h" 
#include "map.h" 

class Enemy{ 
     public: 
     Enemy(); 
     Enemy(float nx, float ny, float nstate); 
     void update(Map lv); 
     bool rectangleIntersects(float rect1x, float rect1y, float rect1w, float rect1h, float rect2x, float rect2y, float rect2w, float rect2h); 
     void update(); 
     float x; 
     float y; 
     Vector2f velo; 
     float speed; 
       float maxFallSpeed; 
     int state; 
     int frame; 
     int width; 
     int height; 

     int maxStates; 
     int *maxFrames; 

     int frameDelay; 

     bool facingLeft; 
     bool onGround; 

     bool dead; 
     int drawType; 
}; 

#endif // ENEMY_H_INCLUDED 

任何人都知道最新情況以及如何解決它?

+0

當你得到這個錯誤時,正在編譯哪個源文件(.cpp,.c,.cc等)?它是什麼樣子的? – 2011-04-12 22:17:34

回答

2

您需要刪除其中一個#include語句以打破循環引用。爲了讓代碼編譯,你可以聲明包含一個類只是一個簡單的定義

class Map; 
在Enemy.hpp文件的頂部

,例如,然後在包括cpp文件頭。

2

有一個循環依賴於你的包括:map.h被包括enemy.henemy.h被包括map.h

必須卸下夾雜。

6

enemy.h包括map.h

但是,map.h包括enemy.h

所以,如果你有enemy.h,處理會是這樣的:

  • ENEMY_H_INCLUDED被定義
  • global.h包括在內
  • map.h包括
    • MAP_H_INCLUDED被定義
    • enemy.h被列入
      • ENEMY_H_INCLUDED已經被定義,所以我們跳過
    • 類地圖被定義 文件的末尾
      • 錯誤,敵人尚未定義

解決這個問題,從enemy.h刪除#include "map.h",並與預先聲明替換它,class Map;

您還需要修改void update(const Map& lv); - 使用一個const &

,包括「地圖。 h「in enemy.cpp

+0

很好的答案,真的。 – Drahakar 2011-04-12 22:42:39

相關問題