2013-05-06 90 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