Как ограничить создание объектов класса на 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