‘class GenericModel / 缺少 class 名称 / 继承的 C++ 前向声明
C++ forward declaration of ‘class GenericModel / missing class name / inheritance
我偶然发现了一个继承问题。所以我在 3 个单独的 headers 中有 3 个 classes 定义如下:
通用Object -> Object
通用Object -> 浅色Object
先继承object:
#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
第三名:
#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 {
这让我很困惑,因为模型 class 没有问题,这是以相同的方式完成的。带有 include 的前向声明。谁能指出我正确的方向?提前致谢! (顺便说一句,Base object 只是 ID)
可能其中之一包括 LightObject.hpp:
#include "GenericShader.hpp"
#include "BaseObject.hpp"
#include "Scene.hpp"
我偶然发现了一个继承问题。所以我在 3 个单独的 headers 中有 3 个 classes 定义如下:
通用Object -> Object 通用Object -> 浅色Object
先继承object:
#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
第三名:
#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 {
这让我很困惑,因为模型 class 没有问题,这是以相同的方式完成的。带有 include 的前向声明。谁能指出我正确的方向?提前致谢! (顺便说一句,Base object 只是 ID)
可能其中之一包括 LightObject.hpp:
#include "GenericShader.hpp"
#include "BaseObject.hpp"
#include "Scene.hpp"