C++ 头守卫在多个文件,他们都依赖于对方,我有2个以上的HPP文件需要对方

C++ 头守卫在多个文件,他们都依赖于对方,我有2个以上的HPP文件需要对方,c++,file,include,C++,File,Include,我已经在谷歌上搜索了将近4天,每天几个小时,没有结果。我不想让它发展到这一点,但我真的什么也找不到。 现在,我将描述我的问题-询问您是否需要澄清: 问题:我有3个HPP文件,它们彼此循环依赖, 头罩也没有任何帮助,只是避免了“包含嵌套太深”的问题。但现在我得到了以下错误:“forest”未在此范围内声明 #ifndef MAINMENU_HPP #define MAINMENU_HPP #include <iostream> #include <windows.h> #i

我已经在谷歌上搜索了将近4天,每天几个小时,没有结果。我不想让它发展到这一点,但我真的什么也找不到。 现在,我将描述我的问题-询问您是否需要澄清:

问题:我有3个HPP文件,它们彼此循环依赖, 头罩也没有任何帮助,只是避免了“包含嵌套太深”的问题。但现在我得到了以下错误:“forest”未在此范围内声明

#ifndef MAINMENU_HPP
#define MAINMENU_HPP
#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <time.h>
using namespace std;

#ifndef MAINMENU_HPP
#include "Areas.hpp"
Areas areas;
#endif
#include "Player.hpp"

#include "SetColor.hpp"
void mainMenu();


void mainMenu()
{
    int action;
    //battle();
    initPlayer();
    if(player.xp >= player.xpRequired)
        {
            player.xp -= player.xpRequired;
            player.lvl += 1;
            SetColor(14);
            cout << endl << "_-*You have leveled up!*-_" << endl << endl;
            SetColor(7);
            player.xpRequired = 40 + player.lvl * 10 * player.lvl;
            levelUp();
        }
    player.damageModifier = 5 + player.strength/2;
    player.baseDamage = 5 + player.strength/2;

    cout << "=================================City of Town==================================" << endl;
    cout << "Made by Erik aka Einar aka NukeTester and Mr.WertyQaz" << endl;
    cout << "Enter [0] to quit" << endl;
    cout << "Enter [1] to view stats" << endl;
    cout << "Enter [2] to go to the forest" << endl;
    cout << "Enter [3] to save the game" << endl;
    cin >> action;

    switch (action)
        {
        case 0:
            //quit();
            break;
        case 1:
        player.xp = 400;
        cout << player.playerName << "'s Inventory " << endl;
        cout << "Health: ";
        SetColor(13);
        cout << player.health;
        SetColor(7);
        cout << "/";
        SetColor(13);
        cout << player.maxHealth << endl;
        SetColor(7);
        cout << "Gold: ";
        SetColor(14);
        cout << player.money;
        SetColor(7);
        cout << endl;
        cout << "Experience: ";
        SetColor(3);
        cout << player.xp;
        SetColor(7);
        cout << "/" ;
        SetColor(3);
        cout << player.xpRequired << endl;
        SetColor(7);
        cout << "Level: ";
        SetColor(2);
        cout << player.lvl << endl;
        SetColor(7);
        cout << "Strength: " << player.strength << endl;
        cout << "Dexterity: " << player.dexterity << endl;
        cout << "Vitality: " << player.vitality << endl;
        cout << "Speed: " << player.speed << endl;
        system("PAUSE");
        system("CLS");
        mainMenu();
        break;
        case 2:
        forest(); // THIS IS THE ERROR
        break;
        }
        }
#endif
我不明白这对他来说是怎么回事,对我来说不是。 我没有测试过他的代码,我也不是一个好的程序员,但在我的世界里,这似乎 真奇怪!
有什么答案吗?

您不需要在任何.cpp文件中添加包含保护,您应该只在头文件中使用包含保护。我可以看到您在main.cpp文件的许多地方添加了包含保护


应该在头文件的第一行添加Inclusion guard,即使头文件会被多次包含,您也只能获得一次它的内容,因为该部分的其余部分将在预封装后被删除

您不需要在任何.cpp文件中添加包含保护,您应该只在头文件中使用包含保护。我可以看到您在main.cpp文件的许多地方添加了包含保护


应该在头文件的第一行添加Inclusion guard,即使头文件会被多次包含,您也只能获得一次它的内容,因为该部分的其余部分将在预封装后被删除

>你想做的是创建一个循环引用,这在C++中是不允许的。 头保护应该出现在每个头文件中,而不是源文件中,例如:

#ifndef HEADER_NAME_MACRO
#define HEADER_NAME_MACRO

//Header contents...

#endif
要解决循环引用问题,需要重新检查设计以消除循环引用。通常,通过让一个或多个标题仅通过指针或引用引用引用其他类中的内容,并向前声明其他类来实现这一点:

标题A:

#ifndef HEADER_A
#define HEADER_A
//Forward declaration, you've told the compiler you'll eventually define B.
class B;

class A {
public:
    B* b;
};

#endif
标题B:

#ifndef HEADER_B
#define HEADER_B

#include <A.hpp>

class B {
public:
    A a;
};
#ifndef头
#定义标题
#包括


<>你似乎误解了人们通常如何在C++中组织代码。标题应该包含声明,源文件应该包含定义。请参阅

< P>你想做的是创建一个循环引用,这在C++中是不允许的。 头保护应该出现在每个头文件中,而不是源文件中,例如:

#ifndef HEADER_NAME_MACRO
#define HEADER_NAME_MACRO

//Header contents...

#endif
要解决循环引用问题,需要重新检查设计以消除循环引用。通常,通过让一个或多个标题仅通过指针或引用引用引用其他类中的内容,并向前声明其他类来实现这一点:

标题A:

#ifndef HEADER_A
#define HEADER_A
//Forward declaration, you've told the compiler you'll eventually define B.
class B;

class A {
public:
    B* b;
};

#endif
标题B:

#ifndef HEADER_B
#define HEADER_B

#include <A.hpp>

class B {
public:
    A a;
};
#ifndef头
#定义标题
#包括


<>你似乎误解了人们通常如何在C++中组织代码。标题应该包含声明,源文件应该包含定义。请参见它找不到
森林()
,因为您在
区域之前使用了已定义的包含防护。hpp

#ifndef MAINMENU_HPP
#define MAINMENU_HPP

// ...

#ifndef MAINMENU_HPP
#include "Areas.hpp"
Areas areas;
#endif

// ...
要解决循环依赖关系,通常在需要时在头文件中使用前向声明


在您的情况下,将函数定义移动到
.cpp
文件中并在头文件中保留声明就足够了。

它找不到
forest()
,因为您在
Areas.hpp
之前使用了已定义的include guard

#ifndef MAINMENU_HPP
#define MAINMENU_HPP

// ...

#ifndef MAINMENU_HPP
#include "Areas.hpp"
Areas areas;
#endif

// ...
要解决循环依赖关系,通常在需要时在头文件中使用前向声明


在您的情况下,将函数定义移动到
.cpp
文件中,只在头文件中保留声明就足够了。

头文件中是否真的有变量和函数定义?我不这么认为,您可以检查代码,由于我不知道如何正确声明函数定义和变量,您的头文件中真的有变量和函数定义吗?我不这么认为,您可以检查代码,因为我不知道如何正确声明函数定义和变量谢谢您的回答!我会检查一下,看看是否有帮助!我应该在哪里添加收割台防护装置/我应该如何添加收割台防护装置?我见过这样的人:#ifndef FOO#H#define FOO#H int x;int-y#endif和类似的东西:#ifndef FOO#H#define FOO#H#包括“Bar.H”#endif类FOO{//BLA BLAH BLAH};标题的开始
#如果取消标题#定义标题(u A
)和标题的结束
#结束
。就这样。如果文件名是CircleClass.h,只需给出适当的名称,然后
#ifndef CIRCLE\u CLASS
感谢您的澄清!我想我必须重新编写我的游戏引擎,才能让它正常工作,没有像我现在这样的错误。@Einar在决定做很多艰苦的工作之前,请正确理解这个问题。可能问题很小,最后你做了很多工作。有时调试问题需要比预期更多的时间。谢谢您的回答!我会检查一下,看看是否有帮助!我应该在哪里添加收割台防护装置/我应该如何添加收割台防护装置?我见过这样的人:#ifndef FOO#H#define FOO#H int x;int-y#endif和类似的东西:#ifndef FOO#H#define FOO#H#包括“Bar.H”#endif类FOO{//BLA BLAH BLAH};标题的开始
#如果取消标题#定义标题(u A
)和标题的结束
#结束
。就这样。如果文件名是CircleClass.h,只需给出适当的名称,然后
#ifndef CIRCLE\u CLASS
感谢您的澄清!我想我必须重新编写我的游戏引擎,才能让它正常工作,没有像我现在这样的错误。@Einar在决定做很多艰苦的工作之前,请正确理解这个问题。可能问题很小,最后你做了很多工作。在某时