Назад к вопросам
Middle+
109
questionbank
Как можно ограничить количество экземпляров класса в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Существует несколько способов ограничить количество экземпляров класса:
-
Одиночка (Singleton): Гарантирует создание только одного экземпляра класса.
class Singleton { public: static Singleton& getInstance() { static Singleton instance; // Гарантированное создание одного экземпляра при первом вызове return instance; } // Запрещаем копирование и присваивание Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: Singleton() {} // Приватный конструктор // Дополнительные члены класса }; -
Счетчик экземпляров: Ведем статический счетчик в классе.
class LimitedInstances { public: LimitedInstances() { if (instanceCount_ >= MAX_INSTANCES) { throw std::runtime_error("Maximum number of instances reached."); } instanceCount_++; } ~LimitedInstances() { instanceCount_--; } // Запрещаем копирование и присваивание LimitedInstances(const LimitedInstances&) = delete; LimitedInstances& operator=(const LimitedInstances&) = delete; private: static const int MAX_INSTANCES = 3; // Максимальное количество экземпляров static int instanceCount_; }; int LimitedInstances::instanceCount_ = 0; // Инициализация статической переменной -
Фабрика (Factory Method): Управляем созданием экземпляров через статический метод.
class LimitedInstancesFactory { public: static LimitedInstancesFactory* createInstance() { if (instanceCount_ >= MAX_INSTANCES) { return nullptr; // Или выбросить исключение } instanceCount_++; return new LimitedInstancesFactory(); // Создание экземпляра } ~LimitedInstancesFactory() { instanceCount_--; } // Запрещаем копирование и присваивание LimitedInstancesFactory(const LimitedInstancesFactory&) = delete; LimitedInstancesFactory& operator=(const LimitedInstancesFactory&) = delete; private: LimitedInstancesFactory() {} // Приватный конструктор static const int MAX_INSTANCES = 2; // Максимальное количество экземпляров static int instanceCount_; }; int LimitedInstancesFactory::instanceCount_ = 0; // Инициализация статической переменной
Каждый подход имеет свои особенности и применим в зависимости от требуемого сценария. Одиночка для одного экземпляра, счетчик и фабрика для заданного количества.