2012-10-01 103 views
6

基類有不完整的類型基類具有不完整的類型錯誤

究竟是什麼這個錯誤意思,我該如何解決?我曾嘗試在我的EntityPhysics標題中通過執行class Entity來宣告該類,但它不起作用。

這裏是我的Entity.h

#ifndef __Game__Entity__ 
#define __Game__Entity__ 

#include <iostream> 
#include <string> 

#include "OGRE/Ogre.h" 

#include "OgreInit.h" 

class Entity{ 
public: 
    Entity(std::string entityId, std::string mesh, Ogre::Vector3 position = Ogre::Vector3::ZERO, Ogre::Vector3 rotation = Ogre::Vector3::ZERO); 
    virtual ~Entity() = 0; 

    void setPosition(Ogre::Vector3 position); 
    Ogre::Vector3 getPosition(); 
    void setRotation(Ogre::Vector3 rotationIncrease); 
    Ogre::Vector3 getRotation(); 
    void setMesh(std::string meshName); 
    std::string getMesh(); 
    virtual void tick() = 0; 
    void removeEntity(); 

    Ogre::Entity getEntity(); 
    Ogre::SceneNode getSceneNode(); 

    std::string entityId; 
protected: 
    Ogre::Entity *ent; 
    Ogre::SceneNode *nod; 
}; 

#endif /* defined(__Game__Entity__) */ 

而且我EntityPhysics.h

#ifndef __Game__EntityPhysics__ 
#define __Game__EntityPhysics__ 

#include <iostream> 
#include <string> 
#include "OGRE/Ogre.h" 
#include "OgreBulletCollisionsBoxShape.h" 
#include "OgreBulletDynamicsRigidBody.h" 

#include "Entity.h" 
#include "OgreInit.h" 

class EntityPhysics: public Entity //error occurs here: "Base class has incomplete type" 
{ 
public: 
    EntityPhysics(std::string pentityId, std::string mesh, Ogre::Vector3 position, Ogre::Vector3 rotation, /*Physics Specific "stuff"*/std::string shapeForm = "BoxShape", float friction = 1.0, float restitution = 0.0, float mass = 1.0); 
    virtual ~EntityPhysics() = 0; 
    virtual void tick() = 0; 
private: 
    float friction, restitution, mass; 

    OgreBulletCollisions::CollisionShape *collisionShape; 
    OgreBulletDynamics::RigidBody *rigidBody; 
}; 

#endif /* defined(__Game__EntityPhysics__) */ 

我想這可能跟我有包括Entity.h在子類的事,但如果我這樣做我犯了同樣的錯誤。

+0

不能向前聲明一個類,然後使用,比如說,繼承前向聲明。你可以用一個前向聲明類型來做的事情是聲明一個指向或指向這個類型的指針。也不是說這兩個類都包含純虛函數,因此您不能直接創建實例。 –

+1

另外,您不應在標識符中使用雙下劃線。以雙下劃線開頭的標識符被保留供編譯器使用。 –

+0

@EdS。,* *含有雙下劃線的標識符被保留([參考](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-標識符))。在我因爲某種原因收到這條消息之前,我花了很多時間閱讀了它。另外,使用下劃線啓動全局範圍標識符會將其放在同一條船上。 – chris

回答

7

這很可能是由於圓形包括,和解決這一問題的辦法是刪除包含在您不需要它們。

Entity.h你並不需要:

#include "OGRE/Ogre.h" 
#include "OgreInit.h" 

你可以,而且應該,而是前瞻性聲明的類型。同爲EntityPhysics.h和:

#include "OGRE/Ogre.h" 
#include "OgreBulletCollisionsBoxShape.h" 
#include "OgreBulletDynamicsRigidBody.h" 

#include "OgreInit.h" 

你真正需要的只有一個是Entity.h

+0

我需要cpp文件中的其他一些類。 – Nik

+0

看起來'Entity.h'仍然需要'OrgeInit.h',因爲在那裏定義了'Ogre :: Vector3 :: ZERO'。 – Rost

+0

@notrodash cpp文件可以包含其他文件,這很好。 –

0

我有我通過移動低#包括向下的標題文件,以便類定義和方法定義,其他的#includes慾望比其它標題提前到來包括解決類似的錯誤消息。

相關問題