Идиомы и стили С++ (Махмутов) - страница 7

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

Вернемся же однако к коду. Я определил два конструктора без аргументов и один закомментировал. Оставленный конструктор меня больше устраивает, но он не годится для преобразования кода в шаблон. Поэтому в шаблоне используется первый. Оператор присваивания проверяет, не происходит ли присвоение самому себе. Это всегда важно, поскольку если не проверить, то следующим шагом мы уничтожим содержимое, так и не оставив себе ничего на память. Поскольку все вроде нормально, рисуем шаблон.

>template ‹class T›

>class MP {

>private:

> T* t;

>public:

> MP():t (new T) {}

> MP(const MP‹T›& mp):t(new T((*mp.t))) {}

> ~MP() {delete t;}

> MP‹T›& operator= (const MP‹T›& mp) {

>  if (this != &mp) {

>   delete t;

>   t = new T(*(mp.t));

>  }

>  return *this;

> }

>};

Чувствуете ли Вы, что идеология умных указателей близка к идеологии COM? Если еще нет, то готовьтесь - сходство явится самое ближайшее время. IUnknown, QueryInterface, ClassFactory и интерфейсы объектов - все полностью взято из идиоматики умных указателей.

Шаг 6 - Ведущие указатели. Еще пара слов.

Применение ведущих указателям таково: Вы можете изменять поведение указываемого класса без применения наследования и не изменяя его код, и его новое поведение не будет отражаться на субклассах. Не обязательно СУЩЕСТВЕННО изменять поведение. Можно вести статистику класса или объекта, или сделать объект "только на чтение", поставив модификаторы const на сам оператор -› и возвращаемое значение:

>const T* operator-›() const;

И вовсе не надо изменять код класса. Это совсем немаловажно, если у Вас, к примеру, коммерческая библиотека классов.

А еще можно сделать умный указатель на ведущий указатель. Или ведущий указатель на ведущий указатель. Вам не стало еще плохо? Если нет, то alors, en route!

Шаг 7 - Интерфейсы. Интерфейсные указатели.

Извините, тут лирическое отступление. Если хотите пропустить - нажмите PageDown.

2001, март, 5 число. Вот уже седьмой шаг. Я ухлопал на эти шаги весь свой законный Курбан-Байрам, и не соблюдаю намаз. Одако не забываю добавлять коньяк в кофе, что придает определенный колорит… шагам. Остановлюсь на некоторое время. Посмотрим, что получится. Честно говоря, мне нужна обратная связь. Я не Толстой, и не Буч, и не совсем уверен, что эти шаги нужны человечеству. Поэтому я прошу Вас сообщить мне, насколько Вам интересны темы, затронутые мною, и если Вас это не затрудняет - несколько слов о том, кто Вы и какой Ваш опыт работы (я хочу выяснить, в какую аудиторию я попадаю, и куда ввязываюсь), буквально пару строк. У меня есть материал примерно еще на 20-30 шагов по идиоматике, а потом можно будет поковырять объектный анализ. Про анализ замечу: софт девелоперу за бугром предлагается 55-70 тонн баксов в год, а аналисту 90-120. Есть разница? Да и вообще, зачем разбирать идиоматику