Назад к вопросам
Middle+
109
questionbank

Как можно ограничить количество экземпляров класса в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Существует несколько способов ограничить количество экземпляров класса:

  1. Одиночка (Singleton): Гарантирует создание только одного экземпляра класса.

    class Singleton {
    public:
        static Singleton& getInstance() {
            static Singleton instance; // Гарантированное создание одного экземпляра при первом вызове
            return instance;
        }
    
        // Запрещаем копирование и присваивание
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    
    private:
        Singleton() {} // Приватный конструктор
    
        // Дополнительные члены класса
    };
    
  2. Счетчик экземпляров: Ведем статический счетчик в классе.

    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; // Инициализация статической переменной
    
  3. Фабрика (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; // Инициализация статической переменной
    

Каждый подход имеет свои особенности и применим в зависимости от требуемого сценария. Одиночка для одного экземпляра, счетчик и фабрика для заданного количества.