我想将项目分成较小的部分,以使其开始变得不可读(超过1000行),并且指定的.h和.cpp存在一些问题,需要使用其他文件中定义的definitons。
项目包含以下文件:
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文件,并且编译器在“库存 list ”行中发现错误; (该类在外部,在RPG.h中声明并在RPG.cpp中定义):'Hero::inventory'使用未定义的类'Inventory'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); };
有:使用未定义类型'Hero'RPG d:\ programming \ rpg \ rpg \ rpg \ rpg.h 97,'-> AddHp'的左侧必须指向类/结构/联合/通用类型RPG d:\ programming \ rpg \ rpg \ rpg \ rpg.h 97
我重新注册了许多站点,但是到处都有人在向main.cpp中简单添加文件而不是在文件之间建立内部连接方面遇到问题。
最佳答案
包含防护措施可防止您将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
中包括文件ojit_code,但在这种情况下,您不能在B.h
中包括文件ojit_code B.h
方法,就可以在A.h
中向前声明class B
并引用该类的指针/引用。 A.h
对象中使用B
方法,只需在B
中包括A
即可访问B.h
中的所有A.cpp
方法。当某些内联方法使用B
的方法/成员