【发布时间】:2015-04-12 02:41:11
【问题描述】:
我确保没有循环依赖,并且包含头文件,希望编译器能够理解所有内容,但我错了
Edit1:还有像pragma once 这样的标头守卫
编辑2:忘记添加所有头文件
我应该更专注于提供清晰完整的内容
相关文件:
Spawner.hpp // 定义类的头文件
#pragma once
// code skipped
#include "weapon.hpp"
#include "movement.hpp"
class Spawner{
private:
int spawnGapTime;
int spawnGapSet;
// If you plan to spawn finite enemies, then use constructor
int spawnLimit = -1;
EnemyTemplate* enemyData;
Weapon* givenWeapon;
Movement* givenMovement;
int ticks;
public:
Spawner(Weapon*, Movement*, EnemyTemplate*, std::vector <int>);
void update();
void spawn_enemy();
void spawn_count();
~Spawner(){
delete givenWeapon;
delete givenMovement;
delete enemyData;
};
};
SceneGame.hpp(一些相关代码)
#pragma once
#include <SFML\Graphics.hpp>
#include "scene.hpp"
#include "game.hpp"
#include "entity.hpp"
#include "movement.hpp"
#include "weapon.hpp"
#include "player.hpp"
#include "collisionGrid.hpp"
#include "spawner.hpp"
// forward declare
class BulletTemplate;
class SceneGame : public Scene{
private:
// some code skipped
std::vector <Spawner*> spawner_list; // the source of the problem
// more code skipped
};
SceneGame.cpp(只包含相关的构造函数)
#include "sceneGame.hpp"
#include "input.hpp"
SceneGame::SceneGame(Game* game){
this->game = game; // need this to run the game.
// code skipped
// SKIP to spawner_list
//
std::vector<BulletTemplate*> player_weapon;
// Typical 3-way gun
player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, 0));
player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, -15));
player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, 15));
// simple rapid fire
bullet_Patterns.push_back(player_weapon);
std::vector<BulletTemplate*> enemy_weapon;
// 2 shot rapid
enemy_weapon.push_back(new BulletTemplate("bulletEnemy", 1, 10, false, -5));
enemy_weapon.push_back(new BulletTemplate("bulletEnemy", 1, 10, false, 5));
bullet_Patterns.push_back(enemy_weapon);
// initalize Movement
std::vector<sf::Vector2f> waypoints = {
sf::Vector2f(-100, 0),
sf::Vector2f(-100, -100),
sf::Vector2f(0, -100),
};
//Movement* enemy_movement = new Movement(sf::Vector2f(400, 400), waypoints);
//
//
///*
std::vector <int> spawnParams = { 60 };
// This is where I use the variable that compiler complained
// Initalize the spawner
spawner_list.push_back(new Spawner(
new Weapon(enemy_weapon, "sequence_enemy", 60, { 8 }),
new Movement(sf::Vector2f(400, 400), waypoints),
new EnemyTemplate(this, "enemySprite", 1, 2, false,
sf::Vector2f(400, 400)), spawnParams));
//*/
// Skipping irrelevant code
}
即使我了解了声明和定义的基础知识,我仍然感到困惑。有什么办法可以解决这个问题
【问题讨论】:
-
错误是什么,发生在哪里?
-
将header guards 添加到您的
.hpp文件中。 -
在您发布的代码中
SceneGame.cpp不包含SceneGame.hpp...如果您真的希望得到任何好的帮助,您需要生成MCVE . -
@JBRPG 每当您开始编写代码时,从小处着手,确保它可以编译,然后进行扩展。您发布的是一个相对较大的卡盘,没有人会努力调试/查看问题所在。尝试将您的案例减少到尽可能少的情况(即,摆脱不必要的功能等)。
-
你
#include <vector>了吗?如果您没有认真地提出一个好问题,我们将无法帮助您。
标签: c++ header-files declaration circular-dependency undeclared-identifier