我在使用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,但我可能应该问另一个问题。
答案 0 :(得分:3)
当函数为pure virtual(= 0
)时,所有子类都必须实现它才能实例化。一个或多个纯虚函数使类抽象,这意味着它无法实例化。如果子类没有实现抽象基类中的所有纯虚函数,它们也会变成抽象的。
如果您不想要纯虚函数,请删除= 0
。