Сущность технологии СОМ. Библиотека программиста :: Бокс Дональд
Страница:
39 из 528
class
// вводится имя класса реализации
FastString *mpThis;
// opaque pointer (size remains constant)
// непрозрачный указатель (размер остается постоянным)
public: FastStringItf(const char *psz);
~FastStringItf(void);
int Length(void) const;
// returns # of characters
// возвращает число символов
int Find(const char *psz) const;
// returns offset
// возвращает смещение
};
Заметим, что двоичное представление этого класса интерфейса не меняется с добавлением или удалением элементов данных из класса реализации FastString . Кроме того, использование опережающего объявления означает, что определение класса FastString не является необходимым для трансляции этого заголовочного файла. Это эффективно скрывает все детали реализации FastString от транслятора клиента. При использовании этого способа машинный код для методов интерфейса становится единственной точкой входа в DLL объекта, и их двоичные сигнатуры никогда не изменятся. Реализации методов класса интерфейса просто передают вызовы методов действующему классу реализации:
// faststringitf.срр
// (part of DLL, not client)
// (часть DLL, а не клиента)
#include «faststring.h»
#include «faststringitf.h»
FastStringItf::FastStringItf(const char *psz) : mpThis(new FastString(psz))
{ assert(mpThis != 0); }
FastStringItf::~FastStringItf(vo1d)
{ delete mpThis; }
int FastStringItf::Length(void) const
{ return mpThis->Length(); }
int FastStringItf::Find(const char *psz) const
{ return mpThis->Find(psz); }
Эти передающие методы должны быть транслированы как часть DLL FastString , так что когда двоичное представление класса реализации FastString меняется, вызов нового оператора в конструкторе FastStringItf будет сразу же перекомпилирован, если, конечно, зарезервировано достаточно памяти. И опять клиент не получит описания класса реализации FastString .
|< Пред. 37 38 39 40 41 След. >|