Как ограничить создание объектов класса на C++

Всем привет, начал писать небольшой движок, чисто для себя и для получения опыта в разработке на C++. Я захотел написать API/Framework (не знаю как точно сказать), чтобы мне было удобно работать с ним. Нынешняя задумка заключалась в том, чтобы написать статические классы движка (Builder, Worker, Destroyer и другие) для того, чтобы каждый отвечал за свою задачу. Пораскинув мозгами, решил написать сразу static class Builder..., однако при компиляции проекта увидел предупреждения о том, что static пропускается, решил вообще загуглить про статичные классы на C++ и информации о конкретно static class нигде не оказалось, как я понял их привычное понимание не предусмотрено в C++ (17). Есть догадка по поводу того, что просто делать все переменные и функции static и конструктор класса запульнуть в private, но не знаю насколько это хороший вариант. Я не хочу, чтобы была возможность создавать экземпляров таких классов, мне понравилась философия создания объектов на Vulkan, в нем изначально есть функции по типу vkCreateInstance, в которую закидывается информации и уже по ссылке на созданный VkInstance, функция сама закидывает в объект все нужное. Возможно я как-то размыто объяснил, если нужна какая-то информация дайте знать.

P.S. Пример кода. Также если есть предложения о том, как можно было организовать функционал движка, советы и прочее, я был бы рад их узнать

#include "engine.hpp"
using namespace Engine;

int main() {

    // Я хочу делать так, обращаться к методам, чтобы не создавать экземпляры класса
    Builder::Build();
    Worker::MainThread(); 
    Destroyer::Destroy(); 
    return 0;

    // И не хочу делать так, то есть запретить это

    Builder* temp = new Builder();
}

P.S. (2) Вот какая философия сейчас в моем коде:

Engine.cpp

#include "engine.hpp"
using namespace Engine;

#include "window.hpp"
using namespace Window;

#include "vulkan.hpp"
using namespace Vulkan;

void Builder::Build() {
    WindowManager::Init();
    VulkanManager::Init();
}

void Worker::MainThread() {
    while (!glfwWindowShouldClose(WindowManager::GetWindow())) {
        glfwPollEvents();
    }
}

void Destroyer::Destroy() {
    WindowManager::Destroy();
    VulkanManager::Destroy();
}

Также вот пример кода заголовочных файлов, я стараюсь писать эту "базу" во всех headers: window_manager.hpp

#ifndef WINDOW_HPP
#define WINDOW_HPP

#pragma once
#include "std_include.hpp"

namespace Window {
    class WindowManager {
    public:
        static void Init();
        static void Destroy();
        static GLFWwindow* GetWindow();
        static const uint32_t GetWindowWidth();
        static const uint32_t GetWindowHeight();

    private:
        static inline GLFWwindow* _Window;
        static const uint32_t WIDTH = 1280;
        static const uint32_t HEIGHT = 720;
    };
}

#endif

Ответы (0 шт):