Essential COM

, Dynamic_Cast. :

 void f(void)  {     IFastString *pfs = 0;      IPersistentObject *ppo = 0;          pfs = CreateFastString("Feed BOB");     if (pfs) {         ppo = (IPersistentObject *) pfs->Dynamic_Cast("IPersistentObject");         if (!ppo)             pfs->Delete();         else {            ppo->Save("C:\\autoexec.bat");            ppo->Delete();         }     } }  

IFastString, Delete IPersistentObject. C++ , vtbl, IExtensibleObject, Delete. , , , , Delete . , , . . . , : , ( " ", on the heap).

, , , , . IExtensibleObject

 class IExtensibleObject {   public:      virtual void *Dynamic_Cast (const char* pszType) =0;      virtual void Delete(void) = 0;  };  

 class IExtensibleObject {   public:      virtual void *Dynamic_Cast(const char* pszType) = 0;      virtual void DuplicatePointer(void) = 0;      virtual void DestroyPointer(void) = 0;  };  

, IExtensibleObject : 1) , DuplicatePointer. 2) , DestroyPointer.

: , :

 class FastString : public IFastString, public IPersistentObject {     int m_cPtrs;       // count of outstanding ptrs        //          public:        // initialize pointer count to zero        //                FastString(const char *psz) : m_cPtrs(0) { }      void DuplicatePointer(void) {        // note duplication of pointer        //                ++m_cPtrs;      }      void DestroyPointer(void) {        // destroy object when last pointer destroyed        //    ,                  if (--m_cPtrs == 0)              delete this;      }      :    :    : };  

- , .

, , , DuplicatePointer/DestroyPointer. FastString . CreateFastString , C++, . , DuplicatePointer:

 IFastString* CreateFastString(const char *psz)  {     IFastString *pfsResult = new FastString(psz);      if (pfsResult)          pfsResult->DuplicatePointer();      return pfsResult;  }  

Dynamic_Cast:

 void *FastString::Dynamic_Cast(const char *pszType) {      void *pvResult = 0;      if (strcmp(pszType, "IFastString") == 0)          pvResult = static_cast<IFastString*>(this);     else          if (strcmp(pszType, "IPersistentObject") == 0)              pvResult = static_cast<IPersistentObject*>(this);          else              if (strcmp(pszType, "IExtensibleObject") == 0)                  pvResult = static_cast<IFastString*>(this);              else return 0;          // request for unsupported interface          //                  // pvResult now contains a duplicated pointer, so         // we must call DuplicatePointer prior to returning          //   pvResult      ,          //           DuplicatePointer      ((IExtensibleObject*)pvResult)->DuplicatePo1nter();      return pvResult;  }  

:

 void f(void)  {     IFastString *pfs = 0;      IPersistentObject *ppo = 0;      pfs = CreateFastString("Feed BOB");     if (pts) {            = (IPersistentObject *)             pfs->Dynamic_Cast("IPersistentObject");         if (ppo) {              ppo->Save("C:\\autoexec.bat");              ppo->DestroyPointer();          }          pfs->DestroyPointer();      }  }  

, , . . DuplicatePointer DestroyPointer (smart pointer) C++.

. . , . FastString . , , , . , .



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net