2016-04-08 1 views
0

Forehand Я хотел бы упомянуть, что я довольно новичок в программировании на C++ и что я использую Ogre3D в качестве рамки (для целей школьного проекта). У меня есть класс Игрок, который наследует от GameObject класс. При попытке построить проект я сталкиваюсь со следующей ошибкой:Неопределенный базовый класс, хотя включает в себя настоящее

Error C2504 'GameObject' : base class undefined - player.h (9)

Что будет означать класс GameObject не определен в заголовочном файле класса игрока. Однако на самом деле я включил заголовочный файл GameObject в файл Player (см. Код ниже). Я знаю, что циркуляр включает в себя код. Однако, если я уйду из них включает в себя я получаю целый список различных ошибок, на которых я не знаю, как и почему они происходят:

compiler errors

Я озадачен этой проблемой в течение нескольких дней в настоящее время и пока не нашли решений по всему Интернету (статья CPlusPlus я в основном консультировался: http://www.cplusplus.com/forum/articles/10627/).

Исходные файлы для перечисленных ниже заголовочных файлов включают только их соответствующие файлы заголовков.

Player.h

#pragma once 

#ifndef __Player_h_ 
#define __Player_h_ 

#include "GameObject.h" 

class Player : public GameObject { 
    // ... Player class interface 
}; 
#endif 

GameObject.h

#pragma once 

#ifndef __GameObject_h_ 
#define __GameObject_h_ 

#include "GameManager.h" 

// Forward declarations 
class GameManager; 

class GameObject { 
// ... GameObject class interface 
}; 
#endinf 

Заголовок GameObject включает в себя GameManager как можно видеть.

GameManager.h

#pragma once 

// Include guard 
#ifndef __GameManager_h_ 
#define __GameManager_h_ 

// Includes from project 
#include "Main.h" 
#include "Constants.h" 
#include "GameObject.h" // mentioned circular includes 
#include "Player.h" // " 

// Includes from system libraries 
#include <vector> 

// Forward declarations 
class GameObject; 

class GameManager { 
// ... GameManager interface 
}; 
#endif 

В довершение там есть Главный класс, который заголовочный файл выглядит следующим образом:

main.h

// Include guard 
#ifndef __Main_h_ 
#define __Main_h_ 

// Includes from Ogre framework 
#include "Ogre.h" 
using namespace Ogre; 

// Includes from projet headers 
#include "BaseApplication.h" 
#include "GameManager.h" 

// forward declarations 
class GameManager; 

class Main : public BaseApplication 
{ 
// ... Main interface 
}; 
#endif 

С все чтение, которое я сделал по этому вопросу, и другие люди с той же ошибкой, что и я, в состоянии разобраться в этом, но все же безрезультатно. Я надеюсь, что кто-то может потратить время, чтобы помочь мне здесь и указать на какой-либо неисправный код или соглашения.

+0

У вас есть ';' после определения вашего класса? Они отсутствуют – vu1p3n0x

+0

Мои плохие, да, определения классов заканчиваются точкой с запятой. Я отредактирую главный пост соответственно. – Stephan

+1

Нет никакого смысла в том, чтобы включать определение класса и форвард-объявление этого класса. Если форвардного объявления достаточно, удалите include. Если вам нужно определение класса, удалите объявление. – molbdnilo

ответ

0

Я думаю, что самый простой способ исправить проблему - изменить вашу модель для включения файлов заголовков. Файл A.h должен включать только B.h, если B.h определяет символ, который используется (непосредственно) в A.h. Как правило, плохое предложение поместить предложение use в файл заголовка - пусть программист клиентского кода сделает это определение. Отбрасывать декларации для классов, если они абсолютно необходимы; нет необходимости в классе GameManager сразу после #include "GameManager.h". Я подозреваю, что что-то еще не так с кодом, но передовые декларации для классов скрывают эту проблему. Если изменение включений не устраняет проблему, начните с одного .cpp-файла, который включает в себя «самый простой» заголовок (тот, который не зависит от каких-либо других), и создайте полный набор включений.

+0

Избегайте включать инструкцию в заголовочные файлы всякий раз, когда можете. Вместо этого используйте форвардную декларацию. – Ceros

+0

Пошел с вашего подхода к очистке всех включений и деклараций и включил все недостающие ссылки шаг за шагом. В конце концов, это привело к тому, что GameManager включил в игру как Player, так и GameObject. Из-за отсутствия практического использования в этих кодах я удалил их, и проект мог построить. Сделал резервную копию, и я получу лучшую форму заголовка. Благодаря! – Stephan