我想将项目分成较小的部分,以使其开始变得不可读(超过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中包括文件o​​jit_code,但在这种情况下,您不能在B.h中包括文件o​​jit_code
  • ,但是只要您不尝试在头文件中使用B.h方法,就可以在A.h中向前声明class B并引用该类的指针/引用。
  • 可以在A.h对象中使用B方法,只需在B中包括A即可访问B.h中的所有A.cpp方法。当某些内联方法使用B的方法/成员
  • 时,无法在.h文件中实现

    10-08 06:54