Шаг 2 - Умные указатели.
Шаг 2 - Умные указатели.
Сначала договоримся о терминах. Перегрузка функций (overloading) - многократное определение функции с разным набором аргументов (сигнатурой). В сигнатуру включается модификатор const, но не включается возвращаемое значение. Перегрузка операторов (overloading) - то же самое (операторы это собственно функции, только имя у них предопределенное), ПЛЮС само определение такого оператора. Если вы определили оператор для какого-то класса, это уже считается перегрузкой. Переопределение функций (overriding) - определение функций в субклассах с тем же именем. Правила переопределения функций достаточно сложны, и я не хотел бы грузить вас ими. Скажу только, что в Object Pascal они не в пример яснее, и компилятор укажет вам, что вы тормоз, если тормознете. А в Плюсах компилятор просто скроет функции, которые вы переопределите неправильно. Ну мы ему отомстим.
В C++ мы можем перегрузить почти все операторы, за исключением нескольких. Во всяком случае, оператор -› перегружается, и это имеет значение крайне важное. Кстати, он называется селектором (member selector). Итак, попробуем:
#include ‹mem.h›
class Cthat {
public:
void doIt(void){return;};
};
class CPthat {
private:
Cthat* aThat;
public:
CPthat(Cthat* _that=NULL):aThat(_that){}
~CPthat() { if (aThat) delete aThat; }
operator Cthat* () { return aThat;} // Оператор преобразования типа
CThat* operator-›() { return aThat; }; // Оператор селектора -›
CPthat operator+(ptrdiff_t _offset) { return CPthat(aThat+_offset); }
// ^^^^^^^^^
};
int main () {
Cthat* aThat = new Cthat;
aThat-›doSomething();
CPthat pthat(new Cthat);
pthat-›doIt(); // Вариант обращения через -›
((Cthat*)pthat)-›doIt (); //Вариант обращения через Cthat*
delete aThat;
return 0;
}
Что получилось: Имеем класс Cthat, который может иметь экземпляры, хотя и не имеет наполнения, и может исполнить пустую функцию. (Обратите внимание. Пустой объект имеет размер 1, и если добавить переменную char, то размер будет тот же. Экземпляры пустых объектов существуют, и они различаются.) Имеем класс объекта-указателя CPthat, в котором храним обычный указатель, но доступ к нему ограничиваем, и перегружаем для него операторы:
1. приведения типа Cthat
2. member selector -›.
3. Операторы арифметики указателей. Я указал только один, сложение.
Идея ясная. Нужно переопределить все восемь, или не переопределять их вовсе. Вопрос в том, направлен ли Ваш указатель на массив, или нет. Во всяком случае, не спешите с этим. Да, и в Ваших плюсах скорее всего тип ptrdiff_t надо заменить на ptr_diff. Я просто дома на BC3.1 все проверяю.
Что здесь хорошего? Мы получили класс объектов-указателей, которые можно смело применять вместо настоящих. Деструктор ~CPthat() уничтожает указуемый объект, поскольку сам по себе последний не имеет имени, и без своего указателя утрачивает идентичность. Проще говоря, останется в нашей памяти навечно, как герой. Ну можно конечно вызывать деструктор и явно, а что? Вот так:
pthat-›~Cthat();
Тогда удаление уберите из деструктора указателя.
Напоследок сделаем очевидный шаг - сделаем умный указатель параметризированным классом.
template ‹class T›
class SmartPointer {
private:
T* tObj;
public:
SmartPointer(T* _t=NULL):tObj(_t);
~SmartPointer(){ if (tObj) delete tObj; }
operator T*(){ return tObj; }
T* operator-›(){ return tObj; }
};
Для интереса посмотрите, как сделан auto_ptr в STL.
Передохнем. Кофе. Джоггинг. Пиво. Сигарета. Нужное подчеркнуть, выпить, покурить.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Указатели
Указатели Указатель в С++ — это переменная, содержащая не сам объект, а адрес памяти, где располагается объект. Java и C# имеют аналогичную концепцию «ссылки» при другом синтаксисе. Мы начнем с рассмотрения придуманного нами примера, иллюстрирующего применение указателей:01
R.8.2.1 Указатели
R.8.2.1 Указатели В описании T D, в котором D имеет вид* список-спецификаций-cv opt D1тип описываемого идентификатора есть"… список-спецификаций-cv указатель на T". Конструкция список-спецификаций-cv относится к указателю, а не к указуемому объекту.Например, в описанияхconst ci = 10, *pc =
3.3. Указатели
3.3. Указатели Указатели и динамическое выделение памяти были вкратце представлены в разделе 2.2. Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно манипулировать этим объектом. Обычно указатели используются для работы с динамически
7.2.4 Указатели
7.2.4 Указатели Если производный класс derived имеет открытый базовый класс base, то указатель на derived можно присваивать перменной типа указатель на base не используя явное преобразовние типа. Обратное преобразование, указателя на base в указтель на derived, должно быть явным.
Указатели
Указатели Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).Тип указателя на
«Умные» вещи с открытыми исходниками: чудачество или перспектива? Евгений Золотов
«Умные» вещи с открытыми исходниками: чудачество или перспектива? Евгений Золотов Опубликовано 29 января 2014 Три с лишним миллиарда долларов, выложенные компанией Google за Nest Labs на прошлой неделе, стали, пожалуй, самой наглядной иллюстрацией того,
Apple патентует «умные» наушники с поддержкой биометрических функций Николай Маслухин
Apple патентует «умные» наушники с поддержкой биометрических функций Николай Маслухин Опубликовано 20 февраля 2014 Не секрет, что компания Apple видит в носимой электронике потенциал для развития своего бизнеса. Слухи о том, что компания вот-вот
«Умные» окна разделят свет и тепло ради комфорта и экономии Андрей Васильков
«Умные» окна разделят свет и тепло ради комфорта и экономии Андрей Васильков Опубликовано 10 сентября 2013 Молодая компания Heliotrope Technologies, созданная на базе Национальной лаборатории им. Лоуренса в Беркли, разработала прозрачный материал для
Умные часы Garmin, разработанные специально для пилотов Николай Маслухин
Умные часы Garmin, разработанные специально для пилотов Николай Маслухин Опубликовано 09 октября 2013 Пока Samsung и Apple экспериментируют с умными часами, крупнейший в мире производитель GPS-навигационной техники компания Garmin Ltd выпускает свою первую
«Умные часы»-2013: что предлагают производители Олег Нечай
«Умные часы»-2013: что предлагают производители Олег Нечай Опубликовано 08 июля 2013 Всё идёт к тому, что 2013-й может стать годом массового появления на рынке «умных часов», которые представляют собой смартфоны с сенсорными экранами, уменьшенные до
Глава 13: Умные мошенники
Глава 13: Умные мошенники Перевод: matt weird (mattweird@whoever.com)Теперь вы выяснили, что когда незнакомец звонит с запросом на чувствительную информацию или на что-то, что может представлять ценность для атакующего, человек, принимающий звонок, должен быть обучен требовать
РЫНКИ: С прицелом на будущее: Умные баннеры сами определят интересы пользователей
РЫНКИ: С прицелом на будущее: Умные баннеры сами определят интересы пользователей Автор: Родион НасакинРедкий человек обладает иммунитетом к рекламе. Она назойливо пытается завладеть вниманием в газетах, по радио, на телеэкране и в Интернете. При этом рекламодатели с
Время, вперёд! Умные часы как буревестник новой компьютерной революции Евгений Золотов
Время, вперёд! Умные часы как буревестник новой компьютерной революции Евгений Золотов Опубликовано 25 марта 2013 Наручные часы — один из древнейших гаджетов. Они сопровождают человека аж с XVII века, а их история полна удивительных поворотов, которые и захочешь — не
Умные машины создают активные банки данных
Умные машины создают активные банки данных Компания Hewlett-Packard, производящая компьютеры, 14 апреля 1999 года опубликовала в Wall Street Journal трехстраничную рекламу. Первые две страницы занимало черно-белое объявление, в котором был изображен хорошо оборудованный гараж с пустым