«Враг» не был объявлен в этой области? - PullRequest
2 голосов
/ 13 апреля 2011

Хорошо, вот моя ошибка: «Враг» не был объявлен в этой области. Ошибка находится в файле map.h, хотя map.h включает в себя врага.h как показано

#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

А вот и враг.

#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

Кто-нибудь знает, что происходит и как это исправить?

Ответы [ 3 ]

6 голосов
/ 13 апреля 2011

enemy.h включает map.h

но map.h включает enemy.h

Итак, если вы включите enemy.h, обработка будет выглядеть примерно так:

  • ENEMY_H_INCLUDED определяется
  • global.h включен
  • map.h включен
    • MAP_H_INCLUDED определяется
    • врага.h включается
      • ENEMY_H_INCLUDED уже определен, поэтому мы переходим к концу файла
    • Карта класса определена
      • ошибка, враг еще не определен

, чтобы исправить это, удалите #include "map.h" из enemy.h и замените его предварительным объявлением, class Map;

Вам также нужно будет изменить void update(const Map& lv); - используйте const &

и включите "map.h" в enemy.cpp

2 голосов
/ 13 апреля 2011

Вам нужно удалить один из операторов #include, чтобы разорвать циклическую ссылку. Чтобы позволить скомпилировать код, вы можете объявить один из включенных классов как простое определение

class Map;
Например,

в верхней части файла Enemy.hpp, а затем включите заголовок в файл cpp.

2 голосов
/ 13 апреля 2011

Существует круговая зависимость в ваших включениях: map.h включает enemy.h и enemy.h включает map.h

Вы должны удалить циклическое включение.

...