com接口与对象内容摘要:
} }。 class IPersist { virtual void Delete()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void Save(const char *pszFile)=0。 virtual void Load(const char *pszFile)=0。 }。 对象实现多个接口 (续五 ) 一个对象实现两个没有继承关系的接口 include class CMyString : public IString2, public IPersist {...} void *CMyString::Dynamic_cast(const char *psz) { if (strcmp(psz,IString)==0) return static_castIString *(this)。 else if (strcmp(psz,IString2)==0) return static_castIString2 *(this)。 else if (strcmp(psz,IPersist)==0) return static_castIPersist *(this)。 return NULL。 } 对象实现多个接口 (续六 ) void main() { IString *p = CreateString(Hello)。 if (p) { IString2 *p2。 IPersist *p3。 const char*psz = pFind(llo)。 int n = pLength()。 if ((p2=(IString2 *)pDynamic_cast(IString2))) char c = p2FindAt(3)。 if ((p3=(IPersist *)pDynamic_cast(IPersist))) p3Save(c:\\temp\\)。 pDelete()。 } }。 对象实现多个接口 (续七 ) 接口的转换 每个接口提供一个用于接口转换的函数 对象实现接口的时候,可以使用 C++编译器本身提供的类型转换功能 每个接口的 Dynamic_cast函数决定了客户可以访问其他哪些接口 对象的生命周期管理 对象只需要被删除一次。 每个接口都有Delete函数。 还是只有一个接口才有。 进一步, 什么时候删除对象。 客户可能拥有多个指向对象的引用, 每个引用各有自己的 lifetime 每个引用从被有效赋值开始,一直到生命周期结束,这期间被称为: outstanding reference 未完结引用 客户管理每个引用的 lifetime, 也就是说它要 显式 地告诉对象引用无效了 对象的生命周期管理 (续 ) 每个对象要管理一个被称为引用计数(reference count)的整数值。 为了有效地管理对象的生命周期,它应该提供一些规则和操作,供客户遵守和使用: 规则:保持引用计数的确切含义,也就是记录当前 outstanding reference的数目。 引用计数从 0开始,首次把接口递交给客户时为 1,以后由客户管理,当引用计数回到 0时,删除自己。 当客户通过复制获得新的接口指针时,引用计数加一,当某个接口不用时,减一 引用计数的两个操作 我们用引用计数的两个管理操作代替原来简单的Delete函数 class IString { virtual void DestroyPointer()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void DuplicatePointer()=0。 virtual const char*Find(const char *psz)=0。 virtual int Length()=0。 }。 class IPersist { virtual void DestroyPointer()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void DuplicatePointer()=0。 virtual void Save(const char *pszFile)=0。 virtual void Load(const char *pszFile)=0。 }。 实现引用计数的两个操作 CMystring::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]), m_refcount(0) { if ( psz ) strcpy(m_psz,psz)。 else m_psz[0] = 0。 } void CMyString::DestroyPointer() { if (0m_refcount) m_refcount。 if (0==m_refcount) delete this。 } void CMyString::DuplicatePointer() { m_refcount++。 } include class CMyString : public IString2, public IPersist { private: char *m_psz。 long m_refcount。 public: CMyString(const char * psz)。 ~CMyString()。 void DuplicatePointer()。 void DestroyPointer()。 void *Dynamic_cast(const char *)。 const char*Find(const char *psz)。 int Length()。 char FindAt(int index)。 void Save(const char *pszFile)。 void Load(const char *pszFile)。 }。 接口转换时刻相当于接口复制 void *CMyString::Dynamic_cast(const char *psz) { void *p = NULL。 if (strcmp(psz,IString)==0) p = static_castIString *(this)。 else if (strcmp(psz,IString2)==0) p = static_castIString2 *(this)。 else if (strcmp(psz,IPersist)==0) p = static_castIPersist *(this)。 if (NULL!=p) m_refcount++。 return p。 } 客户管理对象的生命周期 void main() { IString *p = CreateString(Hello)。 if (p) { IString2 *p2。 IPersist *p3。 const char*psz = pFind(llo)。 int n = pLength()。 if ((p2=(IString2 *)pDynamic_cast(IString2))) { char c = p2FindAt(3)。 p2DestroyPointer()。 } if ((p3=(IPersist *)pDynamic_cast(IPersist))) { p3Save(c:\\temp\\)。 p3DestroyPointer()。 } pDestroyPointer()。 } }。 extern C void *CreateString(const char *psz, const char *pszinterface) { void *pret = NULL。 CMyString *p = new CMyString(psz)。 if (NULL!=p) { pret= pDynamic_cast(pszinterface)。 if (NULL==pret) delete p。 } return pret。 } 修改创建。com接口与对象
相关推荐
Ease of adapter development Adapter certification program To ensure quality and pleteness of BizTalk adapters Adapter Certification Program Certification by Unisys Developed with and endorsed by
Page 17 ABB Automation University CONDUCTOR VMS 操作 - 操 作 开机与关机 退出登录( LogOut) 按 COM’D LINE MENU 按 G 选择 LOG OUT 关机 在 SESSION MANAGERS窗口上选择: Startup/Shutdown Shutdown 在 SESSION MANAGERS窗口上选择:
Beijing so many seats. is not only good at languages, but also at history and geography. Not only good at languages, but also at history and geography. will you see is she have never read such an
skirt 裙子 • dress 连衣裙 • Tshirt T恤衫 • red 红色的 • blue 蓝色的 • yellow 黄色的 • green 绿色的 • white 白色的 • no 不;不是 • not 不;不是的 • colour 颜色 Unit3 • warm 暖和的 • cold 寒冷的 • cool 凉爽的 • today 今天 • jeans 牛仔裤(复数
nce, NTU SCI Journal papers 理學院各領域與亞太地區各校之比較與世界排名 College of Science, NTU 化學 地球科學 數學 物理 SCI 篇數 世界 排名 SCI 篇數 世界 排名 SCI 篇數 世界 排名 SCI 篇數 世界 排名 臺灣大學 3,186 47 602 139 2,734 102 東京大學 7,959 5 2,502 11 760