Шаг 5 - Ведущие указатели (Master Pointers). Важные конструкторы.
Шаг 5 - Ведущие указатели (Master Pointers). Важные конструкторы.
Если мы уж взялись заниматься умными указателями, то очень быстро придем к выводу, что неплохо ограничить их свободу так, чтобы два указателя не указывали на один объект. Далее я их называю ведущими указателями. Для этого нужно реализовать буквально три-четыре правила:
1. Порождение ведущего указателя порождает объект, уничтожение ведущего указателя уничтожает объект;
2. Копирование ведущего указателя создает точную копию объекта;
3. Присваивание ведущего указателя уничтожает предыдущий объект и ставит на его место копию нового объекта.
Если же мы хотим получить однозначное соответствие объекта и его ведущего указателя, то нужно запретить создание объекта, кроме как при помощи ведущего указателя, и запретить создание ведущего указателя, кроме как специальной функцией. Последнее в общем не обязательно, а первое весьма важно.
Такие простые, но замечательно полезные механизмы просто сами набираются на клавиатуре сначала в виде класса, а потом в виде шаблона класса (мы же не последний день на свете живем, пригодится еще).
class CThat {
private:
int i;
public:
CThat (int _i=0):i(_i) {}
CThat (const CThat& _that):i(_that.i) {}
CThat& operator=(const CThat& _that) {
if (this == &_that) return *this;
i = _that.i;
return *this;
}
};
class MasterPointer {
private:
CThat* t;
public:
// MasterPointer():t(new CThat){}
MasterPointer(CThat _that=0):t(new CThat(_that)) {}
MasterPointer(const MasterPointer& mp): t(new CThat((*mp.t))) {}
~MasterPointer() { delete t; }
MasterPointer& operator=(const MasterPointer& mp) {
if (this != &mp) {
delete t;
t = new CThat(*(mp.t));
}
return *this;
}
};
Напоминать не надо, что this - это указатель на самого себя? Кстати и оказалось, что для реализации ведущего указателя класс указываемого объекта должен и сам иметь:
1. Конструктор без аргументов или с аргуметами, имеющими значения по умолчанию (default constructor). Компилятор вам нарисует такой один, если вы не определите конструкторов вообще никаких. На вид это будет просто ежик чернобыльский. Попытка создать внутри функции (я имею в виду в стеке) массив таких объектов наплодит вам массив дегенератов (это вне семантики ведущих указателей, мы же договариваемся, что без ведущих указателей такие объекты вообще не существуют). Так что не рискуйте.
2. Конструктор копии. Если вы не определите его, то компилятор нарисует свой. ТАКОЕ компилятору можно позволять только в крайнем случае, или перед пенсией, ибо по сравнению с этим чудовищем упомянутый ранее ежик просто Киану Ривз.
3. Оператор присваивания. То же самое. Подробности можно узнать в любой книге по C++, или в киоске с видеокассетами в разделе "Ужасы".
4. Виртуальный деструктор. Ну это еще ничего. Если Вы его не определите, то компилятор не задушит Вас ночью. Но вообще… должны быть очень серьезные причины для того, чтобы деструктор не был виртуальным, если вы наследуете свой класс или собираетесь от него наследовать.
Кстати, пока я нахожусь в этой теме, хочу заметить, понятия "конструктор по умолчанию", "конструктор без аргументов" и "конструктор, генерируемый компилятором" легко спутать, если сразу не уяснить их отношения. Конструктор по умолчанию - это конструктор, который может быть вызван без указания агрументов. Он может иметь аргументы, но все они имеют значения по умолчанию. Конструктор без аргументов - тот, у которого аргументы вообще не определены. Конструкторы, генерируемые компилятором - два конструктора - без аргументов и копии - создаются только в том случае, если Вы не определили других конструкторов.
Вернемся же однако к коду. Я определил два конструктора без аргументов и один закомментировал. Оставленный конструктор меня больше устраивает, но он не годится для преобразования кода в шаблон. Поэтому в шаблоне используется первый. Оператор присваивания проверяет, не происходит ли присвоение самому себе. Это всегда важно, поскольку если не проверить, то следующим шагом мы уничтожим содержимое, так и не оставив себе ничего на память. Поскольку все вроде нормально, рисуем шаблон.
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 и интерфейсы объектов - все полностью взято из идиоматики умных указателей.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Pocket Hack Master
Pocket Hack Master Страница программы: http://www.wizcode.comСтатус: Shareware, $20…И ведь как обидно бывает, когда ваш КПК или коммуникатор начинает «тормозить»! Вроде бы понятно, что требовать от «наладонника» особой прыти нельзя… Но хоть фильмы-то можно без рывков воспроизводить? И
Mobile Master
Mobile Master Сайт: http://www.mobile-master.comРазмер: 15 МбСтатус: Shareware ($30)Программа для редактирования и синхронизации данных телефонной книги мобильных телефонов марок IPhone, BenQ, LG, Motorola, Nokia, Siemens, Sony Ericsson (полный список поддерживаемых моделей можно посмотреть на офсайте) с программами Outlook,
Глава 11. Ошибки, ведущие к утрате анонимности
Глава 11. Ошибки, ведущие к утрате анонимности 11.1. Как не совершать ошибок? Очень легко нечаянно себя рассекретить. Достаточно один раз без анонимизации зайти под своим "анонимным именем" на ресурс, на который вы обычно заходили анонимно. Это самая распространенная ошибка
Следы, ведущие к бриллиантам
Следы, ведущие к бриллиантам Однажды нас попросили переделать дизайн для сайта интернет-магазина Leo Diamond. Следуя принципам архитектуры убеждения, мы для начала создали персонажа, которому дали имя Натали. Это привлекательная молодая женщина 29 лет. Она зарабатывает около
Настройка InterVideo Disc Master
Настройка InterVideo Disc Master Разработчики программы InterVideo Disc Master не стали лишать пользователя удовольствия изменять настройки программы, но предоставили эту возможность в минимальном объеме.Выберите в меню Инструменты пункт Параметры. Откроется окно Общий параметр
Создание форм по технологии «master—detail»
Создание форм по технологии «master—detail» Теперь мы рассмотрим главную форму, которая реализует подход «master—detail». Главный вид представляет собой список компакт-дисков. Вид описания деталей представляет собой список дорожек текущего компакт-диска. Это диалоговое окно
Download Master
Download Master Основные характеристики:• официальный сайт программы – www.westbyte.com/dm/;• размер дистрибутива – 4,8 Мбайт;• условия использования – бесплатно;• язык интерфейса – многоязычный, русский присутствует.Программа Download Master (рис. 2.2) ориентирована на русскоязычных
Download Master
Download Master Производитель: WestByte Software (http://www.westbyte.com/dm).Статус: бесплатная.Страница для скачивания: http://www.westbyte.com/index.phtml?page=download&tmp=1&lng=Russian.Размер: 2,7 Мбайт.Неоспоримое преимущество Download Master перед конкурентами – ее полная бесплатность. При этом в верхней части окна закачки
Шаг 6 - Ведущие указатели. Еще пара слов.
Шаг 6 - Ведущие указатели. Еще пара слов. Применение ведущих указателям таково: Вы можете изменять поведение указываемого класса без применения наследования и не изменяя его код, и его новое поведение не будет отражаться на субклассах. Не обязательно СУЩЕСТВЕННО изменять
Адаптеры указателей на функции (Adaptors for pointers to functions)
Адаптеры указателей на функции (Adaptors for pointers to functions) Чтобы позволить указателям на (унарные и бинарные) функции работать с функциональными адаптерами, библиотека обеспечивает следующее:template ‹class Arg, class Result›class pointer_to_unary_function: public unary_function‹Arg, Result› {protected: Result
Секреты важные, но не очень
Секреты важные, но не очень Автор: Киви БердЗа последнее время кучно, один за другим, в открытый доступ поступило сразу несколько важных исторических документов, долгое время считавшихся утраченными или строго засекреченными. Каждый из этих материалов проливает свет