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

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

Жанры

Идиомы и стили С++

Makhmutov Albert

Шрифт:

 void funct2(void);

};

// Это все содержится в cpp-файле.

// и первое - определение указываемого объекта

class Cthat {

 friend class CPthat;

private:

protected:

 Cthat;

public:

 // Родной интерфейс.

 void funct1(void);

 void funct2(void);

};

//Реализация
членов-функций класса указателя.

CPthat::CPthat :t(new Cthat) {}

CPthat::CPthat (const CPthat& _cp):t(new Cthat(*(_cp.t))) {}

CPthat::~CPthat { delete t; }

CPthat& CPthat::operator=(const CPthat& _cp) {

 if (this != &_cp) {

delete t;

t = new Cthat(*(_cp.t));

 }

 return *this;

}

void CPthat::funct1(void) { t-›funct1; }

void CPthat::funct2(void) { t-›funct2; }

// Реализация членов-функций класса объекта

Cthat::Cthat {}

void Cthat::funct1(void) {}

void Cthat::funct2(void) {}

Все, приплыли. От класса указываемых объектов остался только перископ в виде class Cthat;, а более ничего. CPthat действует вместо него. Он сам стал им. Класс CPthat является классом интерфейсного указателя.

Теперь можете идти за пивом. Вы властелин вселенной. Вы можете превратить кого угодно во что угодно. Имея на вооружении идиомы умных, ведущих и интерфейсных указателей, сочетая их в любых комбинациях, Вы можете превратить в урода любой класс на выбор. Или в красавца. Ваше желание - закон, господин. Мне кажется, Вы уже знаете, о чем будет следующий шаг. Но я не могу подобрать нормального термина этому. Слово "интерфейс" заездили до последней степени. Скоро руль и педали назовут интерфейсом автомобиля к шоферу, а вилка, ложка и нож будут универсальным интерфейсом еды. И конечно, Мелкомякг именно это слово применил для следующей идеи. А еще это называют "suite" - комплект, или "facet" - грань. В общем, следующий шаг - о множественных интерфейсных указателях на объект.

Шаг 8 - Еще раз о статистике класса.

Пока праздники не начались и не кончились, пока работает интернет и библиотека, снова займемся любимым делом - статистикой класса. Мы уже говорили о ней, и уяснили, что здесь неплохо работает идиома ведущих указателей. Но на плюсах работает в течение 20 лет сотни тысяч программеров, и было бы неверно предположить, что они за это время не изобрели иных приличных способов реализовать статистику. Так… что же они там навыдумывали?

Мысль о классе, ответственном за статистику, приходит быстро. Да, это работает, но как только иерархия классов разрастается, увеличивается количество геморроя. Наследование становится множественным, потом виртуальным, статические члены сохраняются в классах мертвым грузом… ну в небольших иерархиях работает, но я не для этого взялся за шаг.

Изящную идиому предложил Коплин в 1995 году, а Мейерс развил ее в 2000. Правда, она предполагает вмешательство в код класса, но это не мешает быть очаровательно красивой. Основана она на том, что мы определяем шаблон класса счетчика и втыкаем его наблюдаемый класс статическим

членом или наследованием. Шаблон расширяется ровно один раз для каждого класса, и это гарантирует нам наличие ровно одного экземпляра статистики. Код лучше объяснит.

// Это шаблон класса, ответственного за статистику.

template ‹class T›

class CCounter {

public:

 CCounter { ++m_iCount; }

 CCounter(const CCounter&) { ++m_iCount; }

 ~CCounter { --m_iCount; }

 static int GetCount { return m_iCount; }

private:

 static int m_iCount;

};

// Парашютики, парашютики берем не забываем!

// Инициализируем статическую мембер-переменную.

template ‹class T› int CCounter‹T›::m_iCount = 0;

// Использование статистики.

class CClass {

public:

 static int GetCount { return CCounter‹CClass>::GetCount; };

private:

 CCounter‹CClass› cInstance;

};

Нор убавить нейзер прибавить, сказать нечего, разве вместо неуместного int поставьте size_t. Это макрос, он расширяется в зависимости от модели памяти или в int или в long. Я уж чтоб народ не смущать, в конце концов сайт называется "Первые Шаги", а не Последний Путь. Можно применить наследование, но не советую. Мейерс нашел какие-то преимущества, но меня не убедил.

Да еще это КРАЙНЕ важно - модификатор const в объявлении функций - не гнушайтесь его юзать! Если функция не изменяет ничего в классе, ставьте не ленясь. Если кто-то захочет позже использовать ее в константной функции, то не сможет - без вмешательства в код, а это надо? Шансы на то, что этот кто-то будете Вы, но более опытный, крайне велики. Трудно набирать? Купите себе кривую клаву и потренируйтесь месячишко стучать вслепую. Эта инвестиция окупится, уверяю Вас как специалист по фондовому рынку. То же с аргументами, передаваемыми в функцию. Не забывайте, что const изменяет сигнатуру функции.

Шаг 9 - Множественные интерфейсные smart-указатели.

Вполне возможно, что Вы работаете с действительно крупным проектом, иерархия классов развилась до огромных размеров, а каждый класс (особенно внизу иерархии) обладает десятками или сотнями открытых функций. Конечно, неплохо задаться вопросом "Насколько разумно это?". Еще лучше, если этот вопрос задать до начала написания кода. Тогда можно вовремя почитать Гради Буча, установить на компьютер "Rational Rose" или сходную CASE– систему, и более чем тщательно спроектировать иерархию классов. К сожалению, вопросы объектного анализа и проектирования выходят далеко за рамки данного Шага и моих способностей. Но на всякий случай сообщу, что Microsoft серьезнейшим образом почистила библиотеку своих классов при выпуске версии для карманных компьютеров, и только в результате такой меры ЭТО стало вообще работать в каких-то разумных пределах и объемах; ошибки этапа моделирования вообще обходятся очень дорого впоследствии, особенно если система развивается.

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

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Сумеречный стрелок 6

Карелин Сергей Витальевич
6. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 6

Случайная первая. Прокурор и училка

Кистяева Марина
Первые. Случайные. Любимые
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Случайная первая. Прокурор и училка

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Сделай это со мной снова

Рам Янка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сделай это со мной снова

Возрождение Феникса. Том 2

Володин Григорий Григорьевич
2. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.92
рейтинг книги
Возрождение Феникса. Том 2

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Красноармеец

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

Самый богатый человек в Вавилоне

Клейсон Джордж
Документальная литература:
публицистика
9.29
рейтинг книги
Самый богатый человек в Вавилоне

Теневой Перевал

Осадчук Алексей Витальевич
8. Последняя жизнь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Теневой Перевал

Последняя Арена

Греков Сергей
1. Последняя Арена
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.20
рейтинг книги
Последняя Арена

Повелитель механического легиона. Том II

Лисицин Евгений
2. Повелитель механического легиона
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том II

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер