2015-02-18 6 views
1

Я создавал класс в том же заголовочном файле, считая, что он будет небольшим, так как мой код был разработан, его нужно было поместить в несколько файлов заголовков/cpp. Моя структура данных зависит от перечисления, которое теперь включено в другой заголовочный файл. Компилятор жалуется."ошибка C2065: необъявленный идентификатор" Включить включение из другого заголовка

ошибка 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 

Я попытался также Экстерн перечислимую GameDataType {GameData = 0, Playername , СЛУЧАЙНОЕ ЧИСЛО};

+0

Не следует переводить переменную enum в класс EnumBox. И использовать значения enum непосредственно, как 'EnumBox :: RANDOMNUMBER' – Chintan

+0

По какой-то причине мне не нужно было определять перечисление как тип данных, как показано в моем обновлении ниже. Не требуется класс для обертки перечисления. – JFGames

ответ

1

У вас есть два заголовка, пытающихся включить друг друга. Удалите все #include, которые вам не нужны; и попытайтесь, если это возможно, заменить их передовыми декларациями.

В частности, найдите способ остановки GameDataNetworkHelper.h и RandomNumber.h от включения друг друга. Если RandomNumber делает что-то действительно странное, оно не должно зависеть от игр, данных или сетей. Возможно, вы могли бы переместить EnumBox в отдельный заголовок, чтобы его было нужно включить.

+0

Нет. Вы можете перекрестно включить, используя атрибуты include и forward. – JFGames

+0

@JFGames: Да, но это не позволяет использовать круговую зависимость, вот что у вас здесь. Один из них будет включен перед другим, а декларации другого не будут доступны там, следовательно, ошибка. –

+0

Да, похоже, я добавил класс common.h, и он разрешил его, как показано выше. Спасибо за вашу помощь. :) – JFGames

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 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^