|
Программирование >> Разработка устойчивых систем
Тот факт, что char traits<>::compare() может в одном случае вызывать strcmp(), а в другом - wcscmp(), в данном случае неважен; функциональность вызова сотраге() одинакова. Политики Просмотр специализации char traits для wchar t показывает, что она почти не отличается от аналогичной специализации для char: templateo struct char traits<wchar t> { typedef wchar t char type; typedef wint t int type; . typedef streamoff off type: typedef wstreampos pos type; typedef mbstate t state type; static void assign(char type& cl. const char type& c2); static bool eqCconst char type& cl, const char type& c2): static bool ItCconst char type& cl. const char type& c2): static int compareCconst char type* si. const char type* s2, size t n): static size t length(const char type* s): static const char type* find(const char type* s. size t n, const char type& a): static char type* move(char type* si, const char type* s2. size t n); static char type* copy(char type* si. const char type* s2, size t n): static char type* assign(char type* s. size t n. char type a): static int type not eof(const int type& c): static char type to char type(const int type& c); static int type to int type(const char type& c); static bool eq int type(const int type& cl. const int type& c2); static int type eofO; Две версии реально различаются лишь набором типов (char и int против wchar t и wint t), а функциональность остается той же. Этим подчеркивается то обстоятельство, что классы характеристик действительно что-то характеризуют, а различия между взаимосвязанными классами характеристик обычно проявляются в типах, константах или фиксированных алгоритмах, которые используют параметры шаблонов, определяющие типы. Классы характеристик обычно сами оформляются в виде шаблонов, поскольку представленные в них типы и константы рассматриваются как атрибуты параметров основного шаблона (например, char и wchar t). В некоторых ситуациях бывает удобно связать функциональность с аргументами шаблонов, чтобы прикладной программист мог легко изменить поведение шаблона. Для примера рассмотрим новую версию ВеагСогпег: : С05:ВеагСогпег2.срр Использование классов политик linclude <iostream> linclude BearCorner.h using namespace std; Классы политик (должны содержать статическую функцию doActionO) class Feed { public: static const char* doActionO { return Feeding : } class Stuff { public: static const char* doActionO { return Stuffing : } Шаблон Guest (использует класс политик и класс характеристик) tempiate< class Guest, class Action. class traits - GuestTraits<Guest> > class BearCorner { Guest theGuest: typedef typename traits::beverage type beverage type: typedef typename traits::snack type snack type: beverage type bev: snack type snack; public: BearCorner(const Guest& g) : theGuest(g) {} void entertainO { cout Action::doActionO theGuest with bev and snack endl: int mainO { Boy cr: BearCorner<Boy. Feed> pcKcr): pcl.entertainO: Bear pb: ВеагСогпег<Веаг. Stuff> pc2(pb): pc2. entertainO; } III:- Предполагается, что параметр шаблона Action в классе BearCorner содержит статическую функцию doActionO, задействованную в функции BearCornero::entertain(). Пользователь может выбирать между классами Feed и Stuff, каждый из которых содержит нужную функцию. Классы, инкапсулирующие функциональность подобным образом, называются классами политик. В нашем примере политики предоставляются через Feed::doAction() и Stuff::doAction(). Здесь классы политик являются обычными классами, но они могут оформляться в виде шаблонов и даже использовать наследование, что открывает дополнительные возможности. Псевдорекурсия и подсчет объектов Даже неопытный программист С++ знает, как отслеживать количество существующих объектов класса. Все, что для этого нужно, - добавить статические переменные и немного изменить логику конструктора и деструктора: : C05:CountedClass.cpp Подсчет объектов с использованиен статических перененных #1 nclude <iostream> using namespace std: class CountedClass { static int count: public: CountedClassО { ++count: } CountedClass(const CountedClass&) { ++count; } 4:ountedClass() { --count; } static int getCountO { return count: } int CountedClass::count - 0: int mainO { CountedClass a: cout CountedClass:rgetCountО endl: III CountedClass b: cout CountedClass::getCount() endl: 2 { Произвольная область видиности: CountedClass c(b): cout CountedClass::getCount() endl: 3 a - c: cout CountedClass::getCountО endl; 3 cout CountedClass::getCountо endl: 2 } III:- Bce конструкторы CountedClass увеличивают статическую переменную count, a деструкторы уменьшают ее. Статическая функция getCount() возвращает текущее количество объектов. Было бы довольно утомительно вручную добавлять эти члены в каждый класс, в котором вы хотите организовать подсчет объектов. Стандартный объектно-ориентированный подход, применяемый, чтобы организовать многократное или совместное использование кода, - наследование. Однако наследование в данном случае решает лишь половину проблемы. Посмотрите, что происходит при включении логики подсчета объектов в базовый класс: : C05:CountedClass2.cpp Неправильная попытка подсчета объектов #include <iostream?- using namespace std; class Counted { static int count: public: CountedО { ++count; } CountedCconst Counted&) { ++count: } -CountedO { --count: } static int getCountO { return count: } int Counted::count - 0: class CountedClass : public Counted {}: class CountedClassZ : public Counted {}: int mainO { CountedClass a: cout CountedClass::getCountO endl; 1 CountedClass b:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |