【问题标题】:Dividing project to .h and .cpp将项目划分为 .h 和 .cpp
【发布时间】:2016-11-13 18:09:05
【问题描述】:

我想将我的项目分成更小的部分,因为它开始变得不可读(超过 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 文件,编译器发现行 Inventory 库存中有错误; (该类在外部,在 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 的问题,而不是在文件之间建立内部连接。

【问题讨论】:

  • main.cpp RPG.h 和 .cpp Hero.h 和 .cpp Globaldefs.h 和 .cpp 显然不是代码的一部分:D fckin 编辑器不允许我发布问题而不将其标记为代码

标签: c++ header include add


【解决方案1】:

包含保护阻止您将 RPG.h 包含在 Hero.h 中,反之亦然。

您所做的是在RPG.h 中转发声明Hero,这很好。

但后来你做到了:

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 问题的代码,但我想这是同一个问题。

总结一下:

  • 您可以在文件B.h 中包含文件A.h,但在这种情况下您不能在A.h 中包含文件B.h
  • 但您可以在 A.h 中转发声明 class B 并引用该类上的指针/引用,只要您不尝试在头文件中使用 B 方法。
  • 要在A 对象中使用B 方法,只需在A.cpp 中包含B.h 并可以访问A.cpp 中的所有B 方法。某些内联方法在使用B的方法/成员时无法在.h文件中实现

【讨论】:

    【解决方案2】:

    您在 RPG.h 和 Hero.h 之间存在循环依赖关系,并且 RPG.h 第 97 行,只有前向声明 (extern class Hero;) 是可见的,因此您只能引用指针和对整个 Hero 对象的引用和无法引用Hero成员

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多