gpt4 book ai didi

c++ - 将项目划分为 .h 和 .cpp

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:01 24 4
gpt4 key购买 nike

我想将我的项目分成更小的部分,因为它开始变得不可读(1000 多行),而且我对指定的 .h 和 .cpp 有一些问题,需要使用其他文件中定义的定义。

项目包含以下文件:

main.cpp RPG.h 和 .cppHero.h 和 .cppGlobaldefs.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 inventory 行发现错误; (该类在外部,在 RPG.h 中声明并在 RPG.cpp 中定义): 'Hero::inventory' 使用未定义类 'Inventory' RPG d:\programming\rpg\rpg\rpg\hero.h 23 我完全不不明白为什么 Mob(RPG.h 和 .cpp 中的其他类)可以正常工作并且 NPC 也定义为外部(在 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”的左侧必须指向类/结构/union/通用类型 RPG d :\编程\rpg\rpg\rpg\rpg.h 97

我研究了很多网站,但到处都有人在简单地将文件添加到 main.cpp 时遇到问题,而不是在文件之间建立内部连接。

最佳答案

包含保护会阻止您将 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文件中实现

关于c++ - 将项目划分为 .h 和 .cpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40577109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com