不能在 .h 文件 C++ 中使用 glGenBuffers
Can't use glGenBuffers in .h file C++
我正在尝试学习 C++ 中的 OpenGL。为了清理我的代码,我试图创建一个包含所有变量的 header 文件,其中描述了 objects。这个 header 看起来像这样:
#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 添加到此命名空间,但一旦我尝试使用 glGenBuffers
和 glGenVertexArray
:
来实现它们
unsigned int VBO;
glGenBuffers(1, &VBO);
IDE (Visual Studio) 向我指出了一个错误,它说“此声明不包括存储 class 或类型标识符”(参考 glGenBuffer
功能;我的编辑器设置为意大利语,因此我的翻译可能不完美)。我还尝试在这个命名空间中添加一个 class (即使在我的开始计划中我想避免这种方法):
#include <...>
namespace data {
class Data {
public:
unsigned int VBO;
glGenBuffers(1, &VBO)
};
}
这次我得到的错误是:“缺少显式类型。它将被使用 int”(指 glGenBuffers
函数;保留我之前写的内容:翻译可能不完美,但是我觉得可以理解)。
作为最后一次尝试,我也尝试在 main.cpp
文件中的 main
函数下实现命名空间。我得到的错误与第一个错误相同,但如果我在 main 中使用这些函数调用,它们就会起作用。我也已经按照 this 指南编写了一些其他 classes,例如 shader.h
或 camera.h
,并且我能够(使用必要的包含,例如 glad/glad.h
) 使用 gl*
函数,例如 glCreateShader
、glCreateProgram
、glAttachShader
等。
来自 OP 的片段:
namespace data {
class Data {
public:
unsigned int VBO;
glGenBuffers(1, &VBO)
};
}
这是语法错误。 glGenBuffers(1, &VBO)
是函数体块作用域外的函数调用。你必须移动它,例如进入 class Data
的构造函数。充其量,您可以将其放入用作 Data::VBO
:
的初始化程序的 lambda 中
namespace data {
class Data {
public:
unsigned int VBO
= []() { unsigned int VBO; glGenBuffers(1, &VBO); return VBO; }();
};
}
看起来有点绕?由于 glGenBuffers()
需要一个指针,因此必须在 lambda 内部使用 局部变量 VBO
。它的值 return
ed 用于初始化 成员变量。 VBO
。当然,我可以给本地变量。另一个名字…
我正在尝试学习 C++ 中的 OpenGL。为了清理我的代码,我试图创建一个包含所有变量的 header 文件,其中描述了 objects。这个 header 看起来像这样:
#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 添加到此命名空间,但一旦我尝试使用 glGenBuffers
和 glGenVertexArray
:
unsigned int VBO;
glGenBuffers(1, &VBO);
IDE (Visual Studio) 向我指出了一个错误,它说“此声明不包括存储 class 或类型标识符”(参考 glGenBuffer
功能;我的编辑器设置为意大利语,因此我的翻译可能不完美)。我还尝试在这个命名空间中添加一个 class (即使在我的开始计划中我想避免这种方法):
#include <...>
namespace data {
class Data {
public:
unsigned int VBO;
glGenBuffers(1, &VBO)
};
}
这次我得到的错误是:“缺少显式类型。它将被使用 int”(指 glGenBuffers
函数;保留我之前写的内容:翻译可能不完美,但是我觉得可以理解)。
作为最后一次尝试,我也尝试在 main.cpp
文件中的 main
函数下实现命名空间。我得到的错误与第一个错误相同,但如果我在 main 中使用这些函数调用,它们就会起作用。我也已经按照 this 指南编写了一些其他 classes,例如 shader.h
或 camera.h
,并且我能够(使用必要的包含,例如 glad/glad.h
) 使用 gl*
函数,例如 glCreateShader
、glCreateProgram
、glAttachShader
等。
来自 OP 的片段:
namespace data {
class Data {
public:
unsigned int VBO;
glGenBuffers(1, &VBO)
};
}
这是语法错误。 glGenBuffers(1, &VBO)
是函数体块作用域外的函数调用。你必须移动它,例如进入 class Data
的构造函数。充其量,您可以将其放入用作 Data::VBO
:
namespace data {
class Data {
public:
unsigned int VBO
= []() { unsigned int VBO; glGenBuffers(1, &VBO); return VBO; }();
};
}
看起来有点绕?由于 glGenBuffers()
需要一个指针,因此必须在 lambda 内部使用 局部变量 VBO
。它的值 return
ed 用于初始化 成员变量。 VBO
。当然,我可以给本地变量。另一个名字…