Шаг 7 - Интерфейсы. Интерфейсные указатели.
Шаг 7 - Интерфейсы. Интерфейсные указатели.
Извините, тут лирическое отступление. Если хотите пропустить - нажмите PageDown.
2001, март, 5 число. Вот уже седьмой шаг. Я ухлопал на эти шаги весь свой законный Курбан-Байрам, и не соблюдаю намаз. Одако не забываю добавлять коньяк в кофе, что придает определенный колорит… шагам. Остановлюсь на некоторое время. Посмотрим, что получится. Честно говоря, мне нужна обратная связь. Я не Толстой, и не Буч, и не совсем уверен, что эти шаги нужны человечеству. Поэтому я прошу Вас сообщить мне, насколько Вам интересны темы, затронутые мною, и если Вас это не затрудняет - несколько слов о том, кто Вы и какой Ваш опыт работы (я хочу выяснить, в какую аудиторию я попадаю, и куда ввязываюсь), буквально пару строк. У меня есть материал примерно еще на 20-30 шагов по идиоматике, а потом можно будет поковырять объектный анализ. Про анализ замечу: софт девелоперу за бугром предлагается 55-70 тонн баксов в год, а аналисту 90-120. Есть разница? Да и вообще, зачем разбирать идиоматику C++, если потом нарисовать диалоговое окно, положить в него одну кнопку, а на OnClick повесить обработчик одного сообщения, весом в 20 тысяч строк. Ну это личное дело каждого. Я сам так делаю. На дельфях и фокспре.
А можно еще потолковать о распределенных приложениях. Или архитектурных решениях. Блин, надо же подняться как-то над WinAPI и RAS, они же и в MSDN есть. Ну ладно, будет с этим. Конец лирического отступления. Вернемся к нашим баранам, то бишь указателям.
Давайте подумаем, какой интерфейс есть у класса. Его объявление? Верно. Но не все. Интерфейс - это то, что видит клиент. А видят разные клиенты разное. Отношения дружбы, наследования, модификаторы доступа сами по себе изменяют интерфейс. Как мы можем приобрести почти неограниченный контроль над интерфейсом? Ранее рассмотренные ведущие указатели не позволяют изменять интерфейс, ибо перегруженный оператор -› действительно позволяет осуществлять доступ к настоящему интерфейсу, а значит, информация о нем должна быть доступна. Ну и не будем его перегружать. Ничего не мешает просто скопировать нужную часть его интерфейса в определение указателя, и вызывать нужные функции объекта в одноименных функциях указателя. Если нас интересует секретность, то делаем все функции не-подстановочными (то есть определяем их вне объявления класса и без модификатора inline). Вот код:
// Это находится в заголовочном файле.
class Cthat;
class CPthat {
private:
Cthat* t; // обычный указатель на объект
public:
CPthat ();
CPthat (const CPthat&);
~CPthat ();
CPthat& operator=(const CPthat&);
// Новый интерфейс - дубликат
void funct1(void);
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" - грань. В общем, следующий шаг - о множественных интерфейсных указателях на объект.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Аналоговые интерфейсные платы
Аналоговые интерфейсные платы Интерфейс PSTN, скорее всего (если не требуется обеспечение многоканальной линии или нет денег на то, чтобы каждый месяц менять телекоммуникационное оборудование), будет состоять из одной или более аналоговых схем, для каждой из которых
Цифровые интерфейсные платы
Цифровые интерфейсные платы Если требуется более 10 телефонных линий или обеспечение возможности подключения к цифровым линиям, используются платы T1 или E1[29]. Однако не стоит забывать, что ежемесячные расходы на обслуживание цифровых PSTN-линий варьируются в широких
Указатели
Указатели Указатель в С++ — это переменная, содержащая не сам объект, а адрес памяти, где располагается объект. Java и C# имеют аналогичную концепцию «ссылки» при другом синтаксисе. Мы начнем с рассмотрения придуманного нами примера, иллюстрирующего применение указателей:01
R.8.2.1 Указатели
R.8.2.1 Указатели В описании T D, в котором D имеет вид* список-спецификаций-cv opt D1тип описываемого идентификатора есть"… список-спецификаций-cv указатель на T". Конструкция список-спецификаций-cv относится к указателю, а не к указуемому объекту.Например, в описанияхconst ci = 10, *pc =
R.8.2.3 Указатели на члены
R.8.2.3 Указатели на члены В описании T D, в котором D имеет видполное-имя-класса :: * список-спецификаций-cv opt D1тип описываемого идентификатора есть "… список-спецификаций-cv указатель на член класса полное-имя-класса типа T".Например, во фрагментеclass X {public: void f(int); int a;};int X::* pmi =
Шаг 9 - Множественные интерфейсные smart-указатели.
Шаг 9 - Множественные интерфейсные smart-указатели. Вполне возможно, что Вы работаете с действительно крупным проектом, иерархия классов развилась до огромных размеров, а каждый класс (особенно внизу иерархии) обладает десятками или сотнями открытых функций. Конечно,
Шаг 10 - Множественные интерфейсные указатели. Продолжение.
Шаг 10 - Множественные интерфейсные указатели. Продолжение. Humpty-Dumpty: "With a name of Your, You might be any shape, almost!" L. Carroll. Throw the looking glass. Сейчас мы поговорим о реализации, но до начала позвольте мне вернуться немного назад и добавить, что есть еще один неплохой способ организации множества
12. Массивы и указатели
12. Массивы и указатели МАССИВЫ. МНОГОМЕРНЫЕ МАССИВЫ. ИНИЦИАЛИЗАЦИЯ МАССИВОВ. УКАЗАТЕЛИ И ОПЕРАЦИИ НАД УКАЗАТЕЛЯМИ. СВЯЗЬ МЕЖДУ МАССИВОМ И УКАЗАТЕЛЕМ. ОПЕРАЦИИ & * (унарные)Между массивами и указателями существует очень тесная связь, поэтому обычно их рассматривают
3.3. Указатели
3.3. Указатели Указатели и динамическое выделение памяти были вкратце представлены в разделе 2.2. Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно манипулировать этим объектом. Обычно указатели используются для работы с динамически
2.3.7 Указатели и Вектора
2.3.7 Указатели и Вектора Указатели и вектора в С++ связаны очень тесно. Имя вектора можно использовать как указатель на его первый элемент, поэтому пример с алфавитом можно было написать так:char alpha[] = «abcdefghijklmnopqrstuvwxyz»; char* p = alpha; char ch;while (ch = *p++) cout «„ chr(ch) „« " = " «« ch «« « = 0“ ««
5.4.5 Указатели на Члены
5.4.5 Указатели на Члены Можно брать адрес члена класса. Получение адреса функции члена часто бывает полезно, поскольку те цели и причины, кторые приводились в #4.6.9 относительно указателей на фунции, в равной степени применимы и к функциям членам. Однако, на настоящее время в
5.4.5 Указатели на Члены
5.4.5 Указатели на Члены Можно брать адрес члена класса. Получение адреса функции члена часто бывает полезно, поскольку те цели и причины, кторые приводились в #4.6.9 относительно указателей на фунции, в равной степени применимы и к функциям членам. Однако, на настоящее время в
7.2.4 Указатели
7.2.4 Указатели Если производный класс derived имеет открытый базовый класс base, то указатель на derived можно присваивать перменной типа указатель на base не используя явное преобразовние типа. Обратное преобразование, указателя на base в указтель на derived, должно быть явным.
Указатели
Указатели Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).Тип указателя на