Сущность технологии СОМ. Библиотека программиста   ::   Бокс Дональд

Страница: 47 из 528

При демонстрации клиенту определения класса реализации от него будет скрыта двоичная инкапсуляция интерфейса; что не позволит клиенту использовать класс интерфейса. Одним из разумных способов обеспечить клиенту возможность использовать объекты FastString является экспорт из DLL глобальной функции, которая будет вызывать новый оператор от имени клиента. При условии, что эта подпрограмма экспортируется с опцией extern "С" , она будет доступна для любого транслятора C++.

// ifaststring.h

class IFastString {

public:

virtual int Length(void) const = 0;

virtual int Find(const char *psz) const = 0;

};

extern "C"

IFastString *CreateFastString(const char *psz);

// faststring.cpp (part of DLL)

// faststring.cpp (часть DLL)

IFastString *CreateFastString (const char *psz)

{ return new FastString(psz); }

Как было в случае класса-дескриптора, новый оператор вызывается исключительно внутри DLL FastString , а это означает, что размер и расположение объекта будут установлены с использованием того же транслятора, который транслировал все методы реализации.

Последнее препятствие, которое предстоит преодолеть, относится к уничтожению объекта. Следующая клиентская программа пройдет трансляцию, но результаты будут непредсказуемыми:

int f(void)

{

IFastString *pfs = CreateFastString(«Deface me»);

int n = pfs->Find(«ace me»);

delete pfs;

return n;

}

Непредсказуемое поведение вызвано тем фактом, что деструктор класса интерфейса не является виртуальным.

|< Пред. 45 46 47 48 49 След. >|

Java книги

Контакты: [email protected]