我在使用 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()
.
但我不知何故被迫getShadertype()
在 BaseShader 中实现。如果我不这样做,我会得到一个未定义的参考错误。
这是我的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++ 我只想getShadertype()
在 VertexShader 、 FragmentShader 等中实现?
我可能搞砸了很多事情,例如我什至无法实例化 Vertex 或 FragmentShader 但我可能应该为此提出另一个问题。