将项目划分为.h和.cpp

时间:2016-11-13 18:09:06

标签: c++ header include add

我想将我的项目分成更小的部分,因为它开始变得不可读(超过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,而不是在文件之间建立内部连接。

2 个答案:

答案 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
  • 的方法/成员时,某些内联方法无法在.h文件中实现

答案 1 :(得分:1)

RPG.h和Hero.h以及RPG.h第97行之间存在循环依赖关系,只有前向声明(extern class Hero;)可见,所以你只能引用整个{{1的指针和引用}}对象,不能引用Hero成员

在任何情况下,循环依赖本身都可能表明设计不佳。