gpt4 book ai didi

c++ - 使用接口(interface)和抽象类

转载 作者:行者123 更新时间:2023-11-28 00:45:29 24 4
gpt4 key购买 nike

我在使用 C++ 中的接口(interface)时遇到了一些麻烦。我目前正在学习 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 接口(interface)和一个名为 BaseShader 的抽象类。现在我想实现 BaseShader 中除 getShadertype() 之外的所有方法。

但是我不知何故被迫在 BaseShader 中实现 getShadertype()。如果我不这样做,我会得到一个 undefined reference 错误。

这是我的 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 但我可能应该为此问另一个问题。

最佳答案

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

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

关于c++ - 使用接口(interface)和抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com