C++ 头守卫在多个文件,他们都依赖于对方,我有2个以上的HPP文件需要对方
我已经在谷歌上搜索了将近4天,每天几个小时,没有结果。我不想让它发展到这一点,但我真的什么也找不到。 现在,我将描述我的问题-询问您是否需要澄清: 问题:我有3个HPP文件,它们彼此循环依赖, 头罩也没有任何帮助,只是避免了“包含嵌套太深”的问题。但现在我得到了以下错误:“forest”未在此范围内声明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
#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在决定做很多艰苦的工作之前,请正确理解这个问题。可能问题很小,最后你做了很多工作。在某时