-->

Undefined base class, though includes present

2019-09-19 04:50发布

问题:

Forehand I'd like to mention I'm fairly new to C++ programming and that I'm using Ogre3D as framework (for school project reasons). I have a class Player which inherits from the GameObject class. When trying to build the project I'm confronted with the following error:

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

Which would imply the GameObject class is undefined within the player class' header file. However I have in fact included the GameObject header file in that of the Player (see code below). I am aware circular including is happening in the code. However if I leave out these includes I get a whole list of different errors on which I'm not sure how or why they occur:

I've been stumped on this problem for a few days now and haven't found any solutions around the Internet as of yet (CPlusPlus article I've mainly been consulting: http://www.cplusplus.com/forum/articles/10627/).

The source files for the below listed header files only include their respective header files.

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

The GameObject header includes the GameManager as can be seen.

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

To top it of there is the Main class which header file looks like the following:

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

With all the reading I did on the subject and other individuals with the same error I'd figure I would be able to figure it out but yet to no avail. I hope someone can take the time to help me out here and point out any faulty code or conventions.

回答1:

I think the easiest way to fix the problem is to change your model for including header files. File A.h should only include B.h if B.h defines a symbol that is used (directly) in A.h. It's also generally a bad idea to put a using clause in a header file - let the programmer of the client code make that determination. Drop forward declarations for classes unless they are absolutely necessary; there's no need for the class GameManager right after #include "GameManager.h". I suspect something else is wrong with the code, but the forward declarations for the classes are hiding that problem. If changing the includes does not fix the problem, start with a single .cpp file that includes the "simplest" header (the one that doesn't depend on any others) and build up to the full set of includes.