我在使用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