С++ - язык, который изучается постепенно.ГЛАВА 15. Поиск указателей

Недорогой но высококачественный сайт. Такое может быть? Да. У нас может быть всё. Достойное качество по доступной цене.
С точки зрения нашей студии создание сайта недорого значит, прежде всего, отменно, технологично и потом уже - недорого.
Удаленная форма работы с клиентами оптимизирует наши расходы и мы можем делать сайты по всему миру. Вам совсем не нужно приезжать к нам. Мы сэкономим Ваше время и средства.

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


По последним данным, на рынке продается по крайней мере 2 768 942 книги о С++, не говоря уже о всевозможных курсах, обучающих программах, журналах и семинарах с коктейлями. И все же в этом изобилии наблюдается удручающее однообразие. Просматривать полку книг о С++ в книжном магазине ничуть не интереснее, чем литературу по бухгалтерии. В сущности, все книги пересказывают одно и то же и отличаются разве что по весу и количеству цветов в диаграммах и таблицах.На сегодняшний день язык Си и языки основанные на синтаксисе Си (например, C++, Java, C#) наиболее популярны в практическом программировании. Язык Си имеет массу достоинств, он прост в изучении и лаконичен. Элементы языка Си (массивы, функции, указатели) максимально приближены к архитектуре компьютеров. Студия Web-дизайна, создание, раскрутка сайта

                    



Материалы книги получены с http://www.itlibitum.ru/

Поиск указателей

Итак, теперь мы знаем, с какими разными указателями нам придется иметь дело. Как же отыскать их все? Чтобы переместить объект, нам придется обновить все указатели на него. Чтобы понять, доступен ли объект, придется собрать все указатели.

Специализированные пространства памяти для указателей

Одно из «силовых» решений - сложить все указатели в одно место, где их будет легко найти. В свою очередь, это подразумевает, что все указатели должны быть умными и храниться в специальных пространствах памяти. Эти пространства должны быть организованы так, чтобы вы могли перебрать их содержимое (то есть создать итерацию для набора умных указателей). В классах все эти *-указатели заменяются дескрипторами или ссылками на умные указатели, поскольку сами указатели должны находиться в отдельном пространстве. В следующем фрагменте программы P и H представляют собой

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

template <class Type>

class P { // Указатель

private:

Type* pointee;

public:

void* operator new(size_t); // Использует специальное

// пространство памяти

void operator delete(void*); // Использует специальное

// пространство памяти

// Все для умных указателей

};

template <class Type>

class H { // Дескриптор

private:

P<Type>* ptr;

public:

// Все для дескрипторов

};

class Foo {

private:

P<Bar>& bar; // Ссылка на умный указатель на Bar

// ИЛИ

H<Bar>& bar; // Дескриптор Bar

};

В первом варианте мы храним ссылку на умный указатель, причем сам указатель, вероятно, хранится где-то в другом месте. Во втором варианте мы используем идиому дескриптора - умного указателя на умный указатель. Сам дескриптор находится в объекте, но указатель, на который он ссылается, - в специальном пространстве указателей, используемом операторами new и delete класса P. Если пространство указателей будет реализовано толково, все указатели можно будет перебирать прямо из

него. В это случае задача перемещения объекта несколько упрощается (хотя и не становится простой), поскольку все указатели на него можно найти в пространстве указателей. Полная реализация этой методики приведена ниже в этой главе.

Скрытые коллекции указателей

Другое возможное решение - поддержать скрытые коллекции умных указателей.

template <class Type>

class P {

private:

static P<Type>* head; // Начало списка MP

static P<Type>* tail; // Конец списка

P<Type>* next; // Следующий элемент списка

P<Type>* previous; // Предыдущий элемент списка

Type* pointee;

public:

P(); // Занести 'this' в список

P(const P<Type>& p); // Занести 'this' в список

~P(); // Удалить 'this' из списка

P<Type>& operator=(const P<Type>& p); // Не изменяя список,

// скопировать p.pointee

// Все для умных указателей

};

Вам придется соблюдать осторожность при выполнении операций со списком в конструкторе копий и операторе =, но во всем остальном реализация достаточно тривиальная. Используя этот шаблон, класс обходится без хранения ссылок на умные указатели; он хранит их непосредственно.

class Foo {

private:

P<Bar> bar; // Указатель автоматически заносится в скрытую коллекцию

};

При конструировании Foo вызывается соответствующий конструктор P, который автоматически заносит bar в скрытую коллекцию. При уничтожении Foo вызывает деструктор P, который удаляет bar из коллекции. Разумеется, вместо двусвязного списка можно воспользоваться другими структурами данных. Кроме того, как вы вскоре убедитесь, для всех этих специализированных указателей стоит создать общий базовый класс и сохранить их все в одной коллекции. В приведенном выше фрагменте для каждого типа указателя создается отдельная коллекция.

Анализ экземпляров

Более радикальный подход - использовать самые обычные указатели и предусмотреть средства для перебора всех указателей, внедренных в экземпляр.

class Foo {

private:

Bar* bar;

};

В данной схеме это разрешается, при условии, что какая-то очень сложная архитектура сможет определить Bar* по имеющемуся Foo. Чтобы реализовать ее, нам понадобится код, который знает структуру каждого экземпляра (а точнее, умеет находить переменные класса, которые являются адресами или могут содержать адреса посредством рекурсии), и возможность точно определить тип указываемого объекта. Например, успешно найденный bar не поможет, если вы не знаете, с чем имеете дело - с настоящим Bar или каким-то классом, производным от Bar. В производном классе могут появиться дополнительные указатели, отсутствующие в Bar.

Мы еще вернемся к этому решению, но если бы это была реклама автомобиля, то в нижней части экрана вы бы увидели предупреждение: «Профессиональный каскадер на закрытом треке. Не пытайтесь повторить в домашних условиях». Тем не менее, во многих ситуациях простые решения не работают, поэтому в следующей главе мы с головой нырнем в эту схему.

Стековые переменные

Конечно, не все указатели являются членами объектов. Некоторые из них - обычные переменные, находящиеся в стеке. Разумеется, решение со специальными  пространствами для стековых переменных не подойдет, если только они не являются дескрипторами или ссылками на умные указатели, хранящиеся в другом месте. Скрытые коллекции с тем же успехом будут работать для указателей, хранящихся в стеке или куче - при условии, что вы организуете обработку исключений, которая будет правильно раскручивать стек. Особого обращения требует лишь одна переменная this, значение

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


Назад    Содержание    Далее    

   Почти всегда целью создания сайта является получение прибыли, которая в свою очередь, зависит от его внешнего вида. Статистика говорит, что около 94% людей, при выборе товара, сначала обращают внимание на упаковку, а потом уже на её содержимое. И если эта упаковка не привлекательная и безвкусная, мало кто обратит на нее внимание, и, соответственно, товар не будет пользоваться спросом.
   В случае с интернет, “упаковкой” выступает ваш сайт, а “товаром” - его контент. Если сайт выглядит непривлекательно, то каким бы ценным и нужным не было его содержимое, люди будут обходить его стороной. Наша задача - сделать ваш сайт привлекательным и удобным, чтобы люди чувствовали себя уютно и комфортно, чтоб они возвращались к вам еще и еще. Соответствие между ценой и качеством вас, несомненно, порадуют.
.
   Мы делаем сайты для бизнеса, а не красочную картинку, которая увешена тяжеловесными флэшами и огромными фотографиями.
   Пользователя, когда он попадает на абсолютно любой сайт, прежде всего интересует информация, затем, как реализовать на этом сайте полученную информацию, чтобы было удобно и просто (юзабилити), подбор цветовой гаммы, расположение блоков на странице и многое другое.

   Перед тем, как заказывать создание сайта, рекомендуем прочесть статью А зачем мне (нам) сайт? или Что нужно знать заказчику сайта
Да и вообще, обратите внимание на раздел Статьи о продвижении сайта и бизнеса там вы найдёте ответы на многие вопросы.