2015-11-05 60 views
0

我偶然發現了一個繼承問題。所以,我有在這樣定義3個獨立的報頭3類:'class GenericModel/missing class name/inheritance的C++前向聲明

GenericObject - >對象 GenericObject - > LightObject

首先繼承對象:

#ifndef GENERICMODEL_HPP 
#define GENERICMODEL_HPP 

#define NO_SDL_GLEXT 
#define GLM_FORCE_RADIANS 
#include <GL/glew.h>//before opengl 
#include <SDL2/SDL.h> 
#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <glm/glm.hpp> 
#include <vector> 
#include <glm/gtc/matrix_transform.hpp> 

#include "GenericShader.hpp" 
#include "BaseObject.hpp" 
#include "Scene.hpp" 

#define FRAGMENT_SHADER 0 
#define VERTEX_SHADER 1 

class GenericShader; 
class Scene; 

class GenericModel: public BaseObject{ 
public: 
    GenericModel(); 
    ~GenericModel(); 
    virtual void Render(); 
    bool LoadShaderProgram(char*,char*); 
    void BindShaders(GenericShader *); 
    void UpdatePosition(glm::vec3); 
    void UpdateRotation(float,glm::vec3); 
    void UpdateScale(glm::vec3); 
    void UpdateMatrix(); 

    bool shadersLoaded; 
    int scenePosNum = 0; 
    GLuint programID;//for now 
    GLuint vertexBuffer; 
    glm::mat4 MVP; 
    glm::mat4 modelMatrix; 
    //Scene *scene; 

protected: 

    GenericShader *shaderObj= NULL; 
    GLuint vaoID; 
    Uint32 verticesCount; 
    float angle; 
    glm::vec3 locationVector; 
    glm::vec3 rotationVector; 
    glm::vec3 scaleVector; 
    Scene *scene; 
}; 
#endif 

第二:

#ifndef MODEL_HPP 
#define MODEL_HPP 


#include "GenericModel.hpp" 
#include <libxml/parser.h> 
#include <libxml/tree.h> 

class GenericModel; 

class Model : public GenericModel{ 

public: 
    Model(); 
    ~Model(); 
    void Render(); 
    bool LoadModelOBJ(char *); 
    bool LoadModelXML(char *); 
    bool LoadTexture(char *); 

private: 
    GLuint textureID; 
    GLuint texture; 
    bool modelLoaded; 
    bool textureLoaded; 
    GLuint textureBuffer; 
    bool OpenOBJModel(char*, std::vector<glm::vec3> & , std::vector<glm::vec2> & , std::vector<glm::vec3> &); 
    bool OpenXMLModel(char *filename, std::vector<glm::vec3> & vertOut, std::vector<glm::vec2> & uvOut, std::vector<glm::vec3> & normalOut); 
}; 
#endif 

Third:

#ifndef LIGHT_OBJECT_HPP 
#define LIGHT_OBJECT_HPP 

#include "GenericModel.hpp" 

class GenericModel; //PROBLEM 

class LightObject: public GenericModel { 

public: 
    LightObject(); 
    ~LightObject(); 
    void Render(); 
    glm::vec3 GetLight(); 
    void SetLight(glm::vec3); 

private: 
    glm::vec3 lightIntenzity; 

}; 
#endif 

當我嘗試編譯它們,我得到

LightObject.hpp:9:27: error: invalid use of incomplete type ‘class GenericModel’ class LightObject: public GenericModel { ^ LightObject.hpp:7:7: error: forward declaration of ‘class GenericModel’ class GenericModel;

如果我刪除向前聲明,出現錯誤新錯誤:

LightObject.hpp:9:40: error: expected class-name before ‘{’ token class LightObject: public GenericModel {

這讓我很困惑,因爲它不會有問題與Model類一樣,它以相同的方式完成。包含前向聲明。任何人都可以指向正確的方向嗎?提前致謝! (順便說一句基地對象只是ID)

+0

如果'GenericModel'不需要GenericShader'的'完整定義和'Scene'在其頭文件,爲什麼你要宣佈他們幷包括他們的頭?你可能在某個地方有循環依賴,並且刪除不必要的包含將有助於找到它。 –

回答

0

大概這些中的一個包括被包括LightObject.hpp:

#include "GenericShader.hpp" 
#include "BaseObject.hpp" 
#include "Scene.hpp"