我在使用C++中的接口时遇到了一些麻烦。我目前正在学习OpenGL,我想写一个小的OOP抽象层。使用接口和抽象类
#ifndef SHADER_H
#define SHADER_H
#include<glload/gl_core.h>
#include<string>
#include "filereader.h"
class IShader
{
public:
virtual ~IShader(){}
virtual void setShaderSource(std::string path) = 0;
virtual bool createShader()= 0;
virtual GLuint getHandle()= 0;
virtual GLenum getShadertype()=0;
};
class BaseShader : public IShader
{
GLuint shaderObj;
std::string shaderSource;
public:
virtual ~BaseShader();
void setShaderSource(std::string path);
bool createShader();
GLuint getHandle();
virtual GLenum getShadertype()=0;
};
class VertexShader : public BaseShader{
public:
GLenum getShadertype(){
return GL_VERTEX_SHADER;
}
};
class FragmentShader : public BaseShader{
public:
GLenum getShadertype(){
return GL_FRAGMENT_SHADER;
}
};
class IShaderProgram{
public:
virtual void attachShader(IShader &s) = 0;
virtual void link() = 0;
virtual void use()=0;
};
#endif // SHADER_H
正如你所看到的,我创建了一个IShader接口和一个名为BaseShader的抽象类。现在我想在BaseShader中实现所有方法,getShadertype()
除外。
但我以某种方式被迫在BaseShader中实现getShadertype()
。如果我不这样做,我会得到一个未定义的引用错误。
这里是我的shader.cpp
#include "shader.h"
GLenum BaseShader::getShadertype(){
return GL_VERTEX_SHADER; // I really don't want to implement getShadertype here
}
bool BaseShader::createShader(){
BaseShader::shaderObj = glCreateShader(BaseShader::getShadertype());
GLint length[1];
length[0] = BaseShader::shaderSource.size();
const GLchar* p[1];
p[0] = BaseShader::shaderSource.c_str();
glShaderSource(BaseShader::getHandle(),1,p,length);
GLint success;
glGetShaderiv(BaseShader::getHandle(), GL_COMPILE_STATUS, &success);
if (!success) {
return false;
}
return true;
}
void BaseShader::setShaderSource(std::string path){
FileReader fileReader(path);
BaseShader::shaderSource = fileReader.get();
}
GLuint BaseShader::getHandle(){
return BaseShader::shaderObj;
}
我如何才能知道C++,我只是想实现VertexShader,FragmentShader等getShadertype()
?
我可能搞砸了很多东西,例如我甚至不能实例化Vertex或FragmentShader,但我可能应该为此提出另一个问题。
它在哪里得到未定义的引用错误? – Shoe 2013-05-06 23:10:29
我在这里得到错误'BaseShader :: shaderObj = glCreateShader(BaseShader :: getShadertype());'和'BaseShader :: getShadertype()'是这里的问题 – 2013-05-06 23:13:11