Реализация класса Singleton в C++

Опубликовано: 21 Января, 2023

Одноэлементный класс — это особый тип класса в объектно-ориентированном программировании, который может иметь только один объект или экземпляр в каждый момент времени. Другими словами, мы можем создать только один экземпляр класса singleton. Новая переменная также указывает на начальный созданный экземпляр, если мы попытаемся создать экземпляр класса Singleton после первого раза. Это реализовано с использованием основных концепций объектно-ориентированного программирования, а именно модификаторов доступа, конструкторов и статических методов.

Шаги по реализации класса Singleton в C++:

  1. Сделайте все конструкторы класса закрытыми.
  2. Удалите конструктор копирования класса.
  3. Создайте частный статический указатель, который может указывать на один и тот же объект класса (одноэлементный класс).
  4. Создайте общедоступный статический метод, который возвращает указатель на тот же объект класса (одноэлементный класс).

Ниже представлена реализация одноэлементного класса на C++:

Объяснение:

  • Во-первых, мы сделали весь конструктор закрытым, чтобы экземпляр класса Singleton не мог быть создан извне.
  • Мы удалили конструктор копирования, чтобы нельзя было создать копию экземпляра.
  • Создал статический член instancePtr и инициализировал его значением NULL . Он указывает на экземпляр класса Singleton.
  • Создан метод getInstance() , который возвращает экземпляр класса Singleton. Это статический метод, потому что к статическим переменным обращаются только статические методы, и мы должны получить доступ к instancePtr , который является статическим членом.
  • Если экземпляр класса Singleton уже существует, то getInstance() вернет указатель на этот экземпляр, поскольку у нас может быть только один экземпляр класса Singleton.
  • Если instancePtr == NULL, это означает, что не существует экземпляра класса Singleton. Итак, getInstance() создаст экземпляр класса Singleton и вернет указатель на него.
  • Мы не можем создать экземпляр класса Singleton, так как все конструкторы закрыты. Мы должны использовать метод getInstance() , чтобы получить его экземпляр.

Случай 1: экземпляр класса Singleton создается заранее.

В этой реализации мы заранее создаем экземпляр класса Singleton (т. е. инициализируем instancePtr экземпляром вместо NULL с помощью нового ключевого слова) и возвращаем его при вызове getInstance() .

Ниже приведена программа на C++ для реализации описанного выше подхода:

Объяснение:

  • Во-первых, мы сделали весь конструктор закрытым, чтобы экземпляр класса Singleton не мог быть создан извне.
  • Мы удалили конструктор копирования, чтобы нельзя было создать копию экземпляра.
  • Создал статический элемент instancePtr и инициализировал его экземпляром, используя ключевое слово new. Он указывает на экземпляр класса Singleton.
  • Создан метод getInstance() , который возвращает instancePtr класса Singleton. Это статический метод, потому что к статическим переменным обращаются только статические методы, и мы должны получить доступ к instancePtr , который является статическим членом.
  • Мы не можем создать экземпляр класса Singleton, так как все конструкторы закрыты. Мы должны использовать метод getInstance() , чтобы получить его экземпляр.

Случай 2: когда экземпляр создается без использования метода getInstance() для создания класса Singleton.

Ниже приведена программа C++ для реализации одноэлементного класса без использования метода getinstance():

Выход

Объяснение: Как показано в приведенном выше выводе, мы не можем создать экземпляр класса Singleton с помощью конструктора. У нас может быть только один экземпляр класса Singleton, который мы получим с помощью метода getInstance() .