1

我正在尝试用 C++ 学习 OpenGL。为了清理我的代码,我试图创建一个头文件,其中包含所有描述对象的变量。这个标题看起来像这样:

#pragma once

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <stb/stb_image.h>

namespace data {

    ...

    float fragments[] = {...}
    int indices[] = {...}

    ...

}

我还想将 VAO 和 VBO 添加到这个命名空间,但是一旦我尝试使用glGenBuffersand来实现它们glGenVertexArray

unsigned int VBO;
glGenBuffers(1, &VBO);

IDE(Visual Studio)指出了一个错误,上面写着“这个声明不包括存储类或类型标识符”(指的是glGenBuffer函数;我的编辑器设置为意大利语,因此我的翻译可能不完美)。我还尝试在这个命名空间中添加一个类(即使在我的开始计划中我想避免这种方法):

#include <...>

namespace data {


    class Data {
 
        public:
            unsigned int VBO;
            glGenBuffers(1, &VBO)

    };
    

}

这次我得到的错误是:“缺少显式类型。它将被使用 int”(指glGenBuffers函数;包含我之前写的内容:翻译可能不完美,但我认为这是可以理解的)。作为最后一次尝试,我也尝试在函数main.cpp下在文件中实现命名空间。main我得到的错误与第一个相同,但如果我在 main 中使用这些函数调用,它们就可以工作。我还已经编写了一些其他类,例如shader.hcamera.h遵循指南,并且我能够(使用必要的包含,例如glad/glad.h)使用gl*诸如glCreateShaderglCreateProgram等功能glAttachShader

4

1 回答 1

1

OP的片段:

namespace data {


    class Data {
 
        public:
            unsigned int VBO;
            glGenBuffers(1, &VBO)

    };

}

这是一个语法错误。glGenBuffers(1, &VBO)是函数体块范围之外的函数调用。例如,您必须将其移动到class Data. 充其量,您可以将其放入一个 lambda 中,该 lambda 用作以下的初始化器Data::VBO

namespace data {


    class Data {
 
        public:
            unsigned int VBO
              = []() { unsigned int VBO; glGenBuffers(1, &VBO); return VBO; }();

    };
    

}

看起来有点绕?正如glGenBuffers()预期的指针,必须在 lambda 内部使用局部变量。 VBO它的值是return用来初始化成员变量的。 VBO. 当然,我本可以给出本地变量。又一个名字……</p>

coliru 现场演示

于 2021-09-09T10:50:44.103 回答