class President
{
i': private:
закрытый стандартный конструктор (запрет создания извне)
В:President() {};
закрытый конструктор копий (запрет создания копии) President(const Presidents);
lz
// закрытый оператор присвоения (запрет присвоения)
const Presidents operator=(const Presidents);
15
// данные-члены: имя президента string Name;
13
:э public:
:з // контролируемое создание экземпляра static Presidents Getlnstance()
234 ЗАНЯТИЕ 9. Классы и объекты
2 2 :
2 3 :
2 4 :
2 5 :
2 6 :
2 7 :
2 8 :
2 9 :
3 0 :
3 1 :
3 2 :
3 3 :
3 4 :
3 5 :
3 6 :
3 7 :
3 8 :
3 9 :
4 0 :
4 1 :
4 2 :
4 3 :
4 4 :
4 5 :
4 6 :
4 7 :
4 8 :
4 9 :
5 0 :
{
статические объекты создаются только однажды static President Onlylnstance;
return Onlylnstance;
}
открытые методы string GetNameO
{
return Name;
}
void SetName(string InputName)
{
Name = InputName;
}
int main()
{
Presidents OnlyPresident = President::GetInstance(); OnlyPresident.SetName("Abraham Lincoln");
чтобы увидеть, как отказ при компиляции запрещает
дублирование, снимите комментарии со следующих строк
// President Second; // конструктор недоступен
President* Third= new President О; // конструктор недоступен
President Fourth = OnlyPresident; // конструктор копий
недоступен
OnlyPresident = President::GetInstance(); // оператор =
недоступен
5 1 :
5 2 : cout « "The name of the President is: ";
5 3 : cout « President::GetInstance().GetName() « endl;
5 4 :
5 5 : return 0;
56: }
Результат
The name of the President is: Abraham Lincoln
Анализ
Обратите внимание на функцию m ain (): в ней всего несколько строк кода и ряд за комментированных строк, которые демонстрируют все комбинации создания новых эк земпляров или копий класса P r e s id e n t , которые не сработают. Давайте проанализируем их одна за другой:
4 7 : // President Second; // конструктор недоступен
4 8 : // President* Third= new President(); // конструктор недоступен
Различные способы использования конструкторов и деструкторов
|
235
|
Строки 47 и 48 — это попытки создания объекта в стеке и распределяемой памяти соответственно, с использованием стандартного конструктора, который недоступен, по скольку в строке 8 он объявлен закрытым.
// President Fourth = OnlyPresident; // конструктор копий
недоступен
строке 49 предпринимается попытка создания копии существующего объекта при по-чощи конструктора копий (присвоение во время создания вызывает конструктор копий), готорый недоступен в функции m ain (), поскольку в строке 11 она объявлена закрытой.
// OnlyPresident = President::GetInstance(); // оператор =
недоступен
Строка 50 является попыткой создания копии через присвоение, которое не сработает, так как оператор присвоения объявлен закрытым в строке 14. Таким образом, функция - a in () никак не может создать экземпляр класса P r e s id e n t , а единственная оставшая-:я возможность получить экземпляр класса P r e s i d e n t — это использовать статическую функцию G e tln s ta n c e (), как в строке 43. Поскольку функция G e tln s ta n c e () является статическим членом класса, она очень похожа на глобальную функцию, которая может 5ыть вызвана и без наличия объекта. Функция G e t l n s t a n c e (), реализованная в стро-iax 21 -27, использует статическую переменную O n ly ln s t a n c e для гарантии наличия одного и только одного экземпляра класса P r e s id e n t . Дело в том, что код строки 24 вы
полняется только однажды (статическая инициализация), а следовательно, функция G e t ln s ta n c e () возвращает единственный доступный экземпляр класса P r e s id e n t , незави симо от того, как он используется (строки 43 и 53) в функции m ain ().
ВНИМАНИЕ!
Используйте шаблон синглетон (singleton pattern) только там, где это абсолют но необходимо, учитывайте будущий рост приложения и его возможностей. Обратите внимание на то, что ограничение создания нескольких экземпляров может стать узким местом архитектуры, когда впоследствии понадобится не сколько экземпляров класса.
Например, если наш проект перерастет от моделирования одной нации к Организации Объединенных Наций, которая в настоящее время насчитывает 192 нации с 192 президентами, проблема архитектуры становится очевидной.
Do'stlaringiz bilan baham: |