freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

com接口與對象-wenkub

2022-10-10 21:52:13 本頁面
 

【正文】 , 沒有看到其他的實現(xiàn)細節(jié) – 保證不同語言編寫的程序可以互操作 – 在不改變接口的情況下,可以單獨升級客戶或者對象 class IString { virtual const char*Find(const char *psz)=0。 int Length()。 int m_nLength。 const char*Find(const char *psz)。 C++接口如何走向 COM接口 ?動態(tài)鏈接符合 COM的需要 ?C++中類形式的接口存在的問題 –客戶看到了什么? –若用 Visual C++ ??0CMyStringQAEPBDZ ??1CMyStringQAEXZ ?FindCMyStringQAEPBDPBDZ ?LengthCMyStringQAEHXZ 客戶眼中的 C++類 (續(xù) ) ?如果是 Borland C++編譯器 () CMyString$bctr$qpxc CMyString$bdtr$qv CMyStringFind$qpxc CMyStringLength$qv ?問題 1:名字沖突 命名沖突解決方案 1 ?模塊定義文件 (.def)中給出別名 LIBRARY MYSTRING EXPORTS CMyString$bctr$qpxc=??0CMyStringQAEPBDZ CMyString$bdtr$qv=??1CMyStringQAEXZ CMyStringFind$qpxc=?FindCMyStringQAEPBDPBDZ CMyStringLength$qv=?LengthCMyStringQAEHXZ 命名沖突解決方案 2 ?模塊定義文件 (.def)中給出序號別名 LIBRARY MYSTRING EXPORTS ??0CMyStringQAEPBDZ 1 ??1CMyStringQAEXZ 2 ?FindCMyStringQAEPBDPBDZ 3 ?LengthCMyStringQAEHXZ 4 LIBRARY MYSTRING EXPORTS CMyString$bctr$qpxc 1 CMyString$bdtr$qv 2 CMyStringFind$qpxc 3 CMyStringLength$qv 4 命名沖突解決方案 3 ?使用 C++類的 vtable ?C++類的 vtable不隨編譯器而變化 ?vtable包含了各個函數(shù)的原型,順序固定,每個函數(shù)的參數(shù)、返回類型等,函數(shù)名并不重要 ?vtable要求這些接口函數(shù)必須是虛函數(shù) ?客戶如何得到 vtable? –仍然需要有一種辦法來創(chuàng)建 C++類 – new/delete? 需要對象的二進制結(jié)構 ——問題 2 C++對象的二進制結(jié)構 ?C++的封裝是語法上的封裝,而不是二進制封裝 ?new/delete是編譯器相關的 –編譯器不僅要知道 public信息,也要知道private信息 ?C++對象的二進制結(jié)構是編譯器相關的 ?即使客戶看到的 C++類公開接口沒有變化,但是 C++類的實現(xiàn)改變了,仍然會打破客戶與對象之間的連接 C++對象與客戶之間的連接問題 ?客戶與 C++對象之間的連接點越小越好 –只有接口部分必要的信息才放入接口 –把 C++類的實現(xiàn)細節(jié)與接口分開 –提取出針對所有編譯器都不變的因素作為客戶與對象共享的接口信息 ?方案 1:句柄 句柄方案 ?方案 1:句柄 ifndef CMyString class CMyString。 ~CMyString()。 } const char*CMyString::Find(const char *psz) { return strstr(m_psz,psz)。 }。 public: CMyString(const char * psz)。 ~CMyString()。 設計 COM接口 —— 從 C++入手 (續(xù) ) ?C++類的實現(xiàn) CMyString::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]) { if ( psz ) strcpy(m_psz,psz)。 } int CMyString::Length() { return strlen(m_psz)。 const char*Find(const char *psz)。 endif class EXPORTORIMPORT IMyString { private: CMyString *m_pthis。 int Length()。 public: CMyString(const char * psz)。 }。 virtual int Length()=0。 ~CMyString()。 如何創(chuàng)建對象? ?不能使用 new ?DLL的唯一接口是引出函數(shù) ?可行方案:單獨提供一個引出函數(shù)供客戶調(diào)用 extern C _declspec(dllexport) IString *CreateString(const char *psz)。 p = CreateString(Hello)。 創(chuàng)建對象 include typedef IString * (*PfnCreateString)(const char *psz)。 if (pfn) { p = pfn(Hello)。 如何刪除對象? ?刪除對象發(fā)生在客戶與對象建立聯(lián)系之后,所以比較好辦 ?但是不能用 delete ?可以讓對象自己把自己刪除 ?在 IString中增加一個方法 class IString { virtual void Delete()=0。 刪除對象自身 include class CMyString : public IString { private: char *m_psz。 const char*Find(const char *psz)。 } include void main() { IString *p。 pDelete()。 virtual int Length()。 virtual void Save(const char *pszFile)。 }。 virtual int Length()=0。 對象實現(xiàn)多個接口 (續(xù)三 ) ?實現(xiàn) Dynamic_cast class CMyString : public IString2{...} void *CMyString::Dynamic_cast(const char *psz) { if (strcmp(psz,IString)==0) return static_castIString *(this)。 if (p) { IString2 *p2。 pDelete()。 virtual void Save(const char *pszFile)=0。 else if (strcmp(psz,IString2)==0) return static_castIString2 *(this)。 if (p) { IString2 *p2。 if ((p2=(IString2 *)pDynamic_cast(IString2))) char c = p2FindAt(3)。 對象實現(xiàn)多個接口 (續(xù)七 ) 接口的轉(zhuǎn)換 ?每個接口提供一個用于接口轉(zhuǎn)換的函數(shù) ?對象實現(xiàn)接口的時候,可以使用 C++編譯器本身提供的類型轉(zhuǎn)換功能 ?每個接口的 Dynamic_cast函數(shù)決定了客戶可以訪問其他哪些接口 對象的生命周期管理 ?對象只需要被刪除一次。 ?當客戶通過復制獲得新的接口指針時,引用計數(shù)加一,當某個接口不用時,減一 引用計數(shù)的兩個操作 ?我們用引用計數(shù)的兩個管理操作代替原來簡單的Delete函數(shù) class IString { virtual void DestroyPointer()=0。 virtual int Length()=0。 virtual void DuplicatePointer()=0。 實現(xiàn)引用計數(shù)的兩個操作 CMystring::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]), m_refcount(0) { if ( psz ) strcpy(m_psz,psz)。
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1