Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

 Singleton : value_(0) {} // частный конструктор

 Singleton(const Singleton&);

 Singleton& operator=(const Singleton&);

};

// Определяем указатель

static Singleton Singleton* Singleton::inst_ = NULL;

Singleton* Singleton::getInstance {

 if (inst_ == NULL) {

inst_ = new Singleton;

 }

 return(inst_);

}

int main {

 Singleton* p1 = Singleton::getInstance;

 p1->setValue(10);

 Singleton* p2 = Singleton::getInstance;

 cout << "Value = " << p2->getValue << '\n';

}

Обсуждение

Существует

множество ситуаций, когда требуется, чтобы у класса существовал только один экземпляр. Для этой цели служит шаблон
Singleton
. Выполнив несколько простых действий, можно реализовать singleton-класс в С++.

Когда принимается решение, что требуется только один экземпляр чего-либо, то на ум сразу должно приходить ключевое слово

static
. Как было сказано в рецепте 8.5, переменная-член
static
— это такая, которая может иметь в памяти только один экземпляр. Для отслеживания единственного объекта singleton-класса используйте переменную-член
static
, как сделано в примере 8.9.

private:

 static Singleton* inst_;

Чтобы клиентский код ничего про нее не знал, сделайте ее

private
. Убедитесь, что в файле реализации она проинициализирована значением
NULL
.

Singleton* Singleton::inst_ = NULL;

Чтобы запретить клиентам создавать экземпляры этого класса, сделайте конструкторы

private
, особенно конструктор по умолчанию.

private:

Singleton {}

Таким образом, если кто-то попробует создать в куче или стеке новый singleton-класс, то он получит дружественную ошибку компилятора.

Теперь, когда статическая переменная для хранения единственного объекта

Singleton
создана, создание объектов
Singleton
ограничено с помощью ограничения конструкторов; все, что осталось сделать, — это предоставить клиентам способ доступа к единственному экземпляру объекта
Singleton
. Это делается с помощью статической функции-члена.

Singleton* Singleton::getInstance {

 if (inst_ == NULL) {

inst_ = new Singleton;

 }

 return(inst_);

}

Посмотрите, как это работает. Если указатель

static Singleton
равен
NULL
, создается объект. Если он уже был создан, то возвращается его адрес. Клиенты могут получить доступ к экземпляру
Singleton
, вызвав его статический метод.

Singleton* p1 = Singleton::getInstance;

И если вы не хотите, чтобы клиенты работали

с указателями, то можно возвращать ссылку.

Singleton& Singleton::getInstance {

 if (inst_ == NULL) {

inst_ = new Singleton;

 }

 return(*inst_);

}

Важно здесь то, что в обоих случаях клиентам запрещено создавать экземпляры объекта

Singleton
, и создается единый интерфейс, который предоставляет доступ к единственному экземпляру.

Смотри также

Рецепт 8.3.

8.10. Создание интерфейса с помощью абстрактного базового класса

Проблема

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

Решение

Создайте абстрактный класс, который определяет интерфейс, объявляя, по крайней мере, одну из своих функций как чисто виртуальную (

virtual
). Создайте классы, производные от этого абстрактного класса, которые будут использовать различные реализации, обеспечивая при этом один и тот же интерфейс. Пример 8.10 показывает, как можно определить абстрактный класс для чтения настроечного файла.

Пример 8.10. Использование абстрактного базового класса

#include <iostream>

#include <string>

#include <fstream>

using namespace std;

class AbstractConfigFile {

public:

 virtual ~AbstractConfigFile {}

 virtual void getKey(const string& header,

const string& key, strings val) const = 0;

 virtual void exists(const string& header,

const string& key, strings val) const = 0;

};

class TXTConfigFile : public AbstractConfigFile {

public:

 TXTConfigFile : in_(NULL) {}

 TXTConfigFile(istream& in) : in_(&in) {}

 virtual ~TXTConfigFile {}

 virtual void getKey(const string& header,

const string& key, strings val) const {}

 virtual void exists(const string& header,

const strings key, strings val) const {}

protected:

 istream* in_;

};

class MyAppClass {

public:

 MyAppClass : config_(NULL) {}

 ~MyAppClass {}

 void setConfigObj(const AbstractConfigFile* p) {config_ = p;}

Поделиться:
Популярные книги

Хорошая девочка

Кистяева Марина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Хорошая девочка

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Одержимый

Поселягин Владимир Геннадьевич
4. Красноармеец
Фантастика:
боевая фантастика
5.00
рейтинг книги
Одержимый

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Маленькая хозяйка большого герцогства

Вера Виктория
2. Герцогиня
Любовные романы:
любовно-фантастические романы
7.80
рейтинг книги
Маленькая хозяйка большого герцогства

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10

Гридень 2. Поиск пути

Гуров Валерий Александрович
2. Гридень
Детективы:
исторические детективы
5.00
рейтинг книги
Гридень 2. Поиск пути

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

Оружие победы

Грабин Василий Гаврилович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Оружие победы

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Конунг Туманного острова

Чайка Дмитрий
12. Третий Рим
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Конунг Туманного острова

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке