Как правильно управлять инициализацией рендерера в конструкторе окна?C++

Программы на C++. Форум разработчиков
Anonymous
Как правильно управлять инициализацией рендерера в конструкторе окна?

Сообщение Anonymous »

В качестве упражнения я пишу простую оболочку на C++ для GLFW и OpenGL. У меня есть два класса: Window и Renderer, где Window владеет экземпляром Renderer.
The Window Класс устанавливает контекст GLFW в своем конструкторе, запускает основной цикл и использует свой член Renderer для обработки рисования. Класс Renderer устанавливает буферы в своем конструкторе и обрабатывает вызовы функций OpenGL.
Проблема, с которой я столкнулся, заключается в том, что OpenGL требует допустимого контекста для любых вызовов функций. Если я инициализирую Renderer до вызова конструктора Window, конструктор Renderer будет запущен до создания контекста GLFW.
Чтобы избежать этого, Я сохраняю unique_ptr для Renderer в классе Window и создаю его экземпляр с помощью std::make_unique внутри конструктора Window. Затем в деструкторе Window я вызываю std::unique_ptr::reset() перед уничтожением контекста GLFW, чтобы гарантировать возможность выполнения вызовов OpenGL для освобождения ресурсов, пока контекст действителен.< /p>

Код: Выделить всё

class Window
{
public:
Window()
{
// Initializing GLFW and creating an OpenGL context
// ...
m_renderer = std::make_unique();
}
~Window()
{
m_renderer.reset();
glfwTerminate();
}
int run()
{
while(...)
{
m_renderer->draw();
// ...
}
return 0;
}
private:
std::unique_ptr m_renderer;
// ...
}

class Renderer
{
public:
Renderer() { /* Set buffers */ }
~Renderer() { /* Free buffers */ }
draw() { glDrawElements(...); /* ... */ }
private:
// ...
}

int main()
{
Window window();
return window->run();
}

Я понимаю, что объект Renderer уже должен быть инициализирован при вызове конструктора Window, но здесь это не так. Я чувствую, что мог инвертировать зависимость между Renderer и Window, или моя общая архитектура может быть неправильной. Я предпочитаю полагаться на вызов конструктора и деструктора в нужный момент в зависимости от области действия, чем на их запуск вручную.
Какое решение будет лучшим?

Подробнее здесь: https://stackoverflow.com/questions/659 ... onstructor

Вернуться в «C++»