Как правильно управлять инициализацией рендерера в конструкторе окна?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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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