我想将我的项目分成更小的部分,因为它开始变得不可读(超过1000行),并且我对指定的.h和.cpp有一些问题需要使用在其他文件中定义的定义。
项目包含以下文件:
的main.cpp RPG.h和.cpp Hero.h和.cpp Globaldefs.h和.cpp
#ifndef Hero_h
#define Hero_h
#include "Globaldefs.h"
#include "RPG.h"
#include <vector>
using namespace std;
extern class NPC;
extern class Inventory;
class Hero
{
protected:
(...)
Inventory inventory;
(...)
public:
vector<Mob*>::iterator TryAttack(vector <Mob*>& monsters, int & number);
vector<NPC*>::iterator TryTalk(vector <NPC*>& _NPCs, int & number);
};
(...)
#endif
上面的声明来自Hero.h文件,编译器在库存清单中发现错误; (该类在外面,在RPG.h中声明并在RPG.cpp中定义):&#39; Hero :: inventory&#39;使用未定义的类&#39;库存&#39; RPG d:\ programming \ rpg \ rpg \ rpg \ hero.h 23我完全不明白为什么Mob(RPG.h和.cpp中的其他类)正常工作而NPC定义为extern(在RPG.h中也是如此) )以及。
#ifndef RPG_h
#define RPG_h
#include "Globaldefs.h"
#include "Hero.h"
#include <vector>
using namespace std;
class Mob;
class NPC;
class Fight;
class Item;
extern class Hero;
(...)
class Meat : public Item
{
(...)
public:
virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); };
};
#endif
这是RPG.h文件,在那里,编译器说行中出现了问题
virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); };
有:使用未定义的类型&#39; Hero&#39; RPG d:\ programming \ rpg \ rpg \ rpg \ rpg.h 97&left-of&#39; - &gt; AddHp&#39;必须指向class / struct / union / generic类型RPG d:\ programming \ rpg \ rpg \ rpg \ rpg.h 97
我搜索了很多网站,但是到处都有人将问题简单地添加到main.cpp,而不是在文件之间建立内部连接。
答案 0 :(得分:3)
包含警卫阻止您在RPG.h
中加入Hero.h
,反之亦然。
您所做的是在Hero
转发声明RPG.h
,这很好。
但是你做了:
virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); };
并且编译器需要知道Hero
类的结构以将其链接到AddHp
方法。你不能这样做。
改为(只是声明方法):
virtual void ActivateEffect(Hero* _hero);
然后移除#include "Hero.h"
行。
然后在RPG.cpp
文件中执行:
#include "Hero.h"
void RPG::ActivateEffect(Hero* _hero) { _hero->AddHp(15); }
我们没有看到Inventory
问题的代码,但我认为这是同样的问题。
总结:
A.h
中加入文件B.h
,但在这种情况下,您无法在B.h
中包含文件A.h
class B
中转发声明A.h
并引用该类的指针/引用,只要您不尝试在头文件中使用B
方法即可。 B
对象中使用A
方法,只需在B.h
中加入A.cpp
即可访问B
中的所有A.cpp
方法。当使用B
答案 1 :(得分:1)
RPG.h和Hero.h以及RPG.h第97行之间存在循环依赖关系,只有前向声明(extern class Hero;
)可见,所以你只能引用整个{{1的指针和引用}}对象,不能引用Hero
的成员。
在任何情况下,循环依赖本身都可能表明设计不佳。