0

我在使用 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 但我可能应该为此提出另一个问题。

4

1 回答 1

3

当一个函数是纯虚函数(= 0)时,所有子类都必须实现它才能实例化。一个或多个纯虚函数使类抽象,这意味着它不能被实例化。如果子类没有实现抽象基类中的所有纯虚函数,它们也会变成抽象的。

如果您不想要纯虚函数,请删除= 0.

于 2013-05-06T23:06:59.600 回答