Сущность технологии COM


Абстрактные базы как двоичные интерфейсы - часть 6


Поскольку деструктор FastString никогда не вызывается, в данном примере из буфера исчезнет строка "Deface me", которая должна там присутствовать.

Очевидное решение этой проблемы — сделать деструктор виртуальным в классе интерфейса. К сожалению, это нарушит независимость класса интерфейса от транслятора, так как положение виртуального деструктора в таблице vtbl может изменяться от транслятора к транслятору. Одним из конструктивных решений этой проблемы является добавление к интерфейсу явного метода Delete как еще одной чисто виртуальной функции, чтобы заставить производный класс уничтожать самого себя в своей реализации этого метода. В результате этого будет выполнен нужный деструктор. Модифицированная версия заголовочного файла интерфейса выглядит так:

// ifaststring.h class IFastString { public: virtual void Delete(void) = 0; virtual int Length(void) const = 0; virtual int Find(const char *psz) const = 0; };

extern "C" IFastString *CreateFastString (const char *psz);

она влечет за собой соответствующее определение класса реализации:

// faststring.h #include "ifaststring.h" class FastString : public IFastString { const int m_cch; // count of characters // счетчик символов char *m_psz; public: FastString(const char *psz); ~FastString(void); void Delete(void); // deletes this instance // уничтожает этот экземпляр int Length(void) const; // returns # of characters // возвращает число символов int Find(const char *psz) const; // returns offset // возвращает смещение };

// faststring.cpp #include <string.h> #include "faststring.h"

IFastString* CreateFastString (const char *psz) { return new FastString(psz); }

FastString::FastString(const char *psz) : m_cch(strlen(psz)), m_psz(new char[m_cch + 1]) { strcpy(m_psz, psz); }

void FastString::Delete(void) { delete this; }

FastString::~FastString(void) { delete[] m_psz; }

int FastString::Lengtn(void) const { return m_cch; }

int FastString::Find(const char *psz) const { // O(1) lookup code deleted for clarity // код поиска 0(1) уничтожен для ясности }




Начало  Назад  Вперед