gpt4 book ai didi

c++ - 如何将函数 "between"称为私有(private)成员的构造函数?

转载 作者:行者123 更新时间:2023-11-30 02:40:47 24 4
gpt4 key购买 nike

我正在编写一个类来管理 OpenGL 应用程序的 GLEW 和 GLFW。框架需要以特定顺序初始化。正确的顺序是这样的:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

glfwInit();
GLFWwindow* w = glfwCreateWindow(1280, 720, "main", 0, 0);
glfwMakeContextCurrent(w);
glewInit();
// GL API is now available

我的类在其构造函数中初始化框架:

class Engine
{
struct GLEW { GLEW() { glewInit(); } };
struct GLFW { GLFW() { glfwInit(); } };

GLFW m_glfw;
// Window::Window calls glfwCreateWindow and glfwMakeContextCurrent
Window m_window;
GLEW m_glew;
// Program::Program requires GL API
Program m_program;

public:
// a simplified version of the real ctor
Engine(int width, int height, const char* name)
: m_window(width, height, name)
{
m_window.setWindowUserPointer(this);
}
};

我不得不求助于 GLEWGLFW 虚拟结构,以便在正确的时间调用 gl*wInit 函数。这有效,但非常脆弱。我的程序的正确性取决于私有(private)成员的精确顺序这一事实让我很担心。

重要的是 glfwInitglewInit 在应用程序的整个生命周期中都只被调用一次,但我可能会创建 Window 的多个实例> 和 Program 类。假定 Engine 类也将被实例化一次。

有更好的方法吗?我特别希望将框架初始化保留在 Engine 类中。等价地,我不想,比如说,将调用移动到 Window::Window 内的 glfwInit (这没有任何意义,因为可能会创建许多窗口但是glfwInit 应该只调用一次)。

最佳答案

在 C++ 中,初始化是构造函数的工作,而清除是析构函数的工作。对于每次成功的初始化,您通常需要相应的清理操作。语言机制会自动执行此操作。

使用这种语言提供的支持称为 RAII,资源获取即初始化

  • 为要初始化和清理的每种(种类)事物创建一个 C++ 类。
  • 将初始化顺序的关系表示为构造函数参数或基类。
  • 对于初始化失败,抛出一个异常(这样就没有这个类的实例)。

由于 OpenGL 的东西使用错误代码,您可能会考虑 std::system_error 而不仅仅是 std::runtime_error;前者(自 C++11 起可用)带有错误代码。

由于 glfwInit 需要在全局范围内调用一次,因此我会自动执行该调用。一种方法是在类的构造函数中放置一个带有初始化的 static 变量,并在头文件中声明该类的虚拟常量。这确保了跨编译单元的单一公共(public)初始化。

关于c++ - 如何将函数 "between"称为私有(private)成员的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666522/

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