我正在同一个头文件中构建一个类,认为它会很小,因为我的代码开发后需要将它放入多个头文件/ cpp文件中。我的数据结构依赖于枚举,现在包含在另一个头文件中。编译器抱怨。
错误C2653:' EnumBox' :不是类或命名空间名称
错误C2065:' PLAYERNAME' :未声明的标识符
错误C2065:' RANDOMNUMBER' :未声明的标识符
当它们使用我的枚举的所有类都在相同的头文件中时,它起作用了。到底是怎么回事? Extern似乎不适用于枚举。
GameDataNetworkHelper.h
#pragma once
#ifndef GAMEDATANETWORKHELPER_H
#define GAMEDATANETWORKHELPER_H
#include "../RakNetP2PExample/NetworkHelper.h"
#include "../GameExample/NumberGuesser.h"
#include "BitStream.h"
#include "../RakNetP2PExample/GameData.h"
#include "..\ConsoleApplication1\RandomNumber.h"
#include "..\ConsoleApplication1\PlayerName.h"
class NumberGuesser;
class NetworkHelper;
class EnumBox
{
public:
static const enum GameDataType {GAMEDATA = 0, PLAYERNAME=1, RANDOMNUMBER=2};
};
//..some code which uses RandomNumber, and PlayerName
#endif
和RandomNumber.h
#pragma once
#ifndef RANDOMNUMBER_H
#define RANDOMNUMBER_H
#include "../RakNetP2PExample/NetworkHelper.h"
#include "../GameExample/NumberGuesser.h"
#include "BitStream.h"
#include "../RakNetP2PExample/GameData.h"
#include "GameDataNetworkHelper.h"
class RandomNumber : public GameData
{
public:
static const int randomNumberType = EnumBox::GameDataType::RANDOMNUMBER;
//.. some other code
};
#endif
PlayerName.h
#pragma once
#ifndef PLAYERNAME_H
#define PLAYERNAME_H
#include "../RakNetP2PExample/NetworkHelper.h"
#include "../GameExample/NumberGuesser.h"
#include "BitStream.h"
#include "../RakNetP2PExample/GameData.h"
#include "GameDataNetworkHelper.h"
class PlayerName : public GameData
{
public:
static const int playerNameType = EnumBox::PLAYERNAME;
//...some other code
};
#endif
我也试过了 extern enum GameDataType {GAMEDATA = 0,PLAYERNAME,RANDOMNUMBER};
答案 0 :(得分:2)
你有两个标题试图互相包含。删除您不需要的任何#include
;并尝试在可能的情况下用前向声明替换它们。
特别是,找到一种方法来阻止GameDataNetworkHelper.h
和RandomNumber.h
相互包容。除非RandomNumber
做一些非常奇怪的事情,否则它不应该依赖于游戏,数据或网络。也许你可以将EnumBox
移动到一个单独的标题中,这样它只需要包含它。
答案 1 :(得分:1)
这很奇怪,但它与GamaDataNetworkHelper类在同一个文件中并不喜欢。
这篇文章帮助极大: Where to put the enum in a cpp program?
按照上面的帖子,我做了一个common.h课程。
#ifndef COMMON_H
#define COMMON_H
enum GameDataType {GAMEDATA = 0, PLAYERNAME=1, RANDOMNUMBER=2};
#endif
然后更新两个派生类型。
class RandomNumber : public GameData
{
public:
static const int randomNumberType = RANDOMNUMBER;
int randomNumb;
int maxNumber;
RandomNumber()
{
type = randomNumberType;
}
~RandomNumber()
{
}
//... continues
};