Программирование >>  Разработка устойчивых систем 

1 ... 67 68 69 [ 70 ] 71 72 73 ... 196


Тот факт, что 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:



1 ... 67 68 69 [ 70 ] 71 72 73 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика