使用抽象函数时出现未处理的异常

用户名

我试图在程序中使用基本着色器进行加载,但是在加载后,我得到了“未处理的异常”弹出框。我创建了一个基类来完成加载通用着色器的所有常见部分。在基类中,我有一个受保护的虚函数和公共函数来处理OpenGL属性。以下是发生情况的两个基本示例:

class ShaderProgram // Base class
{
    public:
    ...

    protected:
        void bindAttribute(GLuint attribNumber, const char* variableName);
        virtual void bindAttributes() = 0; // needed for different shaders

    private:
        GLuint programID;
        void loadShaders(const char* vertFile, const char* fragFile);
}


class BasicShader : public ShaderProgram // derived class
{
    public:
    ...
    protected:
    void bindAttributes() { bindAttribute(0, "position"); }
    ...
}

现在在loadShaders()

programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
bindAttributes(); // Unhandled Exception pointing here

尝试运行该错误时,出现此错误。但如果我取代bindAttributes()glBindAttribLocation(programID, 0, "position")被称为内bindAttribute(),程序运行,因为它应该。关于什么导致此错误的任何想法?

克里斯多夫(Christophe)

我看到这loadShaders()是私人的ShaderProgram根据您描述的症状和解决方法,我怀疑您可以从类的构造函数中调用它。

如果是这种情况,则是由于在构造过程中使用了纯虚函数。更具体地说,BasicShader从基础派生的类的构建过程ShaderProgram如下所示:

  • 首先,ShaderProgram构造类的基础对象目前,该对象仅为ShaderProgramm您可以在其构造函数中调用的虚函数仍然是基类中定义的虚函数。
  • 然后将派生对象构造在基础对象的顶部。仅当您输入派生对象的构造函数时,的虚函数BasicShader才会生效。

因此,如果您loadShaders()从的构造函数进行调用ShaderProgramm,它将最终尝试立即调用bindAttributes()它,但它仍然是纯虚函数(即,未定义)。

标准10.4 / 6:成员函数可以从抽象类的构造函数(或析构函数)中调用;对于从这样的构造函数(或析构函数)创建(或销毁)的对象直接或间接对纯虚函数进行虚拟调用的效果是不确定的。

有两种解决方案:

  1. loadShaders()BasicShader从而不是从的构造函数调用ShaderProgram这要求您将功能设置为受保护的,而不是私有的。
  2. 您可以更改类逻辑,并强制执行与构造过程不同的加载/初始化阶段。

如果我的假设是错误的,并且您没有loadShaders()从构造函数中调用,请在您调用它的位置发布代码以及对其参数进行初始化,然后我将更新答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用抽象函数时出现未处理的异常

来自分类Dev

使用Fontsize,FontAttributes和HorizontalOptions时出现未处理的异常错误

来自分类Dev

分配martix元素时出现未处理的异常

来自分类Dev

运行Tesseract OCR时出现未处理的异常

来自分类Dev

运行Tesseract OCR时出现未处理的异常

来自分类Dev

使用OleDbDataAdapter函数时未处理OleDbException

来自分类Dev

使用OleDbDataAdapter函数时未处理OleDbException

来自分类Dev

在opencv_core310.dll中使用findContours函数时,OpenCV引发未处理的异常

来自分类Dev

当控制权返回给调用函数时,从二进制文件读取后出现未处理的异常

来自分类Dev

退出时未处理的异常

来自分类Dev

关于cvFloodFill()函数的OpenCV未处理异常

来自分类Dev

函数“MoveNext”中发生未处理的异常

来自分类Dev

错误:尝试部署/(重新)发布ShinyApps.io时出现未处理的异常

来自分类Dev

将const char转换为char时出现未处理的异常

来自分类Dev

比较2个char值vb.net时出现未处理的异常

来自分类Dev

在远程计算机上运行exe文件时出现未处理的异常

来自分类Dev

当我尝试写入2D数组时出现未处理的异常

来自分类Dev

从Android SIP类调用SipProfile.Builder时出现未处理的异常

来自分类Dev

保存数据库条目时为什么会出现“未处理的异常”?

来自分类Dev

MoqRT错误-创建MoqRT.Baked.dll时出现未处理的异常

来自分类Dev

向2D数组中的struct成员添加值时出现未处理的异常

来自分类Dev

尝试在Android Studio中设置HttpURLConnection时出现“未处理的异常”

来自分类Dev

使用opencv / c ++应用Canny边缘检测器后出现“未处理的异常”错误

来自分类Dev

使用语句未处理的异常

来自分类Dev

使用检测记录未处理的异常

来自分类Dev

使用语句未处理的异常

来自分类Dev

在useEffect中调用Firestore时出现“未处理的拒绝(TypeError):snapshot.data不是函数”

来自分类Dev

如何抑制“执行请求时发生未处理的异常”。使用Serilog记录消息

来自分类Dev

使用鼠标单击与鼠标光标移动的回调时的OpenGL未处理的异常

Related 相关文章

  1. 1

    使用抽象函数时出现未处理的异常

  2. 2

    使用Fontsize,FontAttributes和HorizontalOptions时出现未处理的异常错误

  3. 3

    分配martix元素时出现未处理的异常

  4. 4

    运行Tesseract OCR时出现未处理的异常

  5. 5

    运行Tesseract OCR时出现未处理的异常

  6. 6

    使用OleDbDataAdapter函数时未处理OleDbException

  7. 7

    使用OleDbDataAdapter函数时未处理OleDbException

  8. 8

    在opencv_core310.dll中使用findContours函数时,OpenCV引发未处理的异常

  9. 9

    当控制权返回给调用函数时,从二进制文件读取后出现未处理的异常

  10. 10

    退出时未处理的异常

  11. 11

    关于cvFloodFill()函数的OpenCV未处理异常

  12. 12

    函数“MoveNext”中发生未处理的异常

  13. 13

    错误:尝试部署/(重新)发布ShinyApps.io时出现未处理的异常

  14. 14

    将const char转换为char时出现未处理的异常

  15. 15

    比较2个char值vb.net时出现未处理的异常

  16. 16

    在远程计算机上运行exe文件时出现未处理的异常

  17. 17

    当我尝试写入2D数组时出现未处理的异常

  18. 18

    从Android SIP类调用SipProfile.Builder时出现未处理的异常

  19. 19

    保存数据库条目时为什么会出现“未处理的异常”?

  20. 20

    MoqRT错误-创建MoqRT.Baked.dll时出现未处理的异常

  21. 21

    向2D数组中的struct成员添加值时出现未处理的异常

  22. 22

    尝试在Android Studio中设置HttpURLConnection时出现“未处理的异常”

  23. 23

    使用opencv / c ++应用Canny边缘检测器后出现“未处理的异常”错误

  24. 24

    使用语句未处理的异常

  25. 25

    使用检测记录未处理的异常

  26. 26

    使用语句未处理的异常

  27. 27

    在useEffect中调用Firestore时出现“未处理的拒绝(TypeError):snapshot.data不是函数”

  28. 28

    如何抑制“执行请求时发生未处理的异常”。使用Serilog记录消息

  29. 29

    使用鼠标单击与鼠标光标移动的回调时的OpenGL未处理的异常

热门标签

归档