2013-05-06 87 views
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()除外。

但我以某种方式被迫在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

它在哪里得到未定义的引用错误? – Shoe 2013-05-06 23:10:29

+0

我在这里得到错误'BaseShader :: shaderObj = glCreateShader(BaseShader :: getShadertype());'和'BaseShader :: getShadertype()'是这里的问题 – 2013-05-06 23:13:11

回答

3

当函数为pure virtual= 0)时,所有的子类必须实现它才能实例化。一个或多个纯虚函数使类抽象,这意味着它不能被实例化。如果子类不从抽象基类实现所有纯虚函数,它们也变得抽象。

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

+1

“当一个函数是纯虚函数时,所有的子类都必须实现它。 “ - 这不是真的。你可以有抽象的子类。 – Shoe 2013-05-06 23:11:25

+0

@ Jueecy.new真实,补充说明。 – 2013-05-06 23:12:01

+0

是的我知道,这里的问题是我想在抽象类(BaseShader)中使用未实现的函数,并在像VertexShader这样的具体类中实现它。如果我在BaseShader中执行'BaseShader :: getShadertype()'获取“undefined reference” – 2013-05-07 10:08:00