我偶然發現了一個繼承問題。所以,我有在這樣定義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)
如果'GenericModel'不需要GenericShader'的'完整定義和'Scene'在其頭文件,爲什麼你要宣佈他們幷包括他們的頭?你可能在某個地方有循環依賴,並且刪除不必要的包含將有助於找到它。 –