Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 05.12.2008, 17:06   #1
Заблокирован
 Старший сержант
Аватар для shagart
 
shagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слуху
Регистрация: 16.07.2008
Сообщений: 209
Популярность: 1335
Сказал(а) спасибо: 231
Поблагодарили 236 раз(а) в 134 сообщениях
Отправить сообщение для shagart с помощью ICQ Отправить сообщение для shagart с помощью Telegram Отправить сообщение для shagart с помощью Yahoo Отправить сообщение для shagart с помощью Skype™
 
По умолчанию Интерфейсы. Интерфейсные указатели

Давайте подумаем, какой интерфейс есть у класса. Его объявление? Верно. Но не все. Интерфейс - это то, что видит клиент. А видят разные клиенты разное. Отношения дружбы, наследования, модификаторы доступа сами по себе изменяют интерфейс. Как мы можем приобрести почти неограниченный контроль над интерфейсом? Ранее рассмотренные ведущие указатели не позволяют изменять интерфейс, ибо перегруженный оператор -> действительно позволяет осуществлять доступ к настоящему интерфейсу, а значит, информация о нем должна быть доступна. Ну и не будем его перегружать. Ничего не мешает просто скопировать нужную часть его интерфейса в определение указателя, и вызывать нужные функции объекта в одноименных функциях указателя. Если нас интересует секретность, то делаем все функции не-подстановочными (то есть определяем их вне объявления класса и без модификатора 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" - грань
  Ответить с цитированием
Пользователь сказал cпасибо:
Ivan_32 (05.12.2008)
Ответ

Метки
интерфейсные, интерфейсы., указатели


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Ведущие указатели (Master Pointers). Важные конструкторы shagart С/С++ 0 05.12.2008 17:04
[Руководство] Умные указатели shagart С/С++ 0 05.12.2008 16:52
Интерфейсы. Глюконатор Треп 3 01.07.2008 10:49

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 15:49.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net