程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++類包含函數說明

C++類包含函數說明

編輯:C++入門知識

C++類包含三個我們關心的函數:構造函數,析構函數,和所有重要的 DoSomething 函數,我們需要把每一個函數包裹成與其等價的C++函數,在這裡拿出來和大家分享一下。

  1. // original class  
  2. class CFoo  
  3. {  
  4. public:  
  5.  CFoo(int x);  
  6.  ~CFoo();  
  7.  int DoSomething(int y);  
  8. };  
  9. // flattened C code  
  10. void* __stdcall new_CFoo(int x)  
  11. {  
  12.  return new CFoo(x);  
  13. }  
  14. int __stdcall CFoo_DoSomething(void* handle, int y)  
  15. {  
  16.  CFoo *foo = reinterpret_cast<CFoo *>(handle);  
  17.  return foo->DoSomething(y);  
  18. }  
  19. void __stdcall delete_CFoo(void *handle)  
  20. {  
  21.  CFoo *foo = reinterpret_cast<CFoo *>(handle);  
  22.  delete foo;  

這裡有幾個比較重要的地方要注意。首先,注意每一個C++類被映射為一個簡單的 C 函數。其次,觀察到我們為 C 函數明確地使用 __stdcall 調用習慣。在前一篇 DLL 文章裡,我們知道簡單的調用在 MSVC DLL 裡的無格式 C 函數,真是很麻煩。

如果我們放棄越過種種艱難困苦去用它,我們可以使這個努力稍微容易一點。讓 Borland 調用 Microsoft DLL 最簡單的辦法是 DLL 導出無格式,無修飾,__stdcall 調用習慣的 C++函數。Borland 和 Microsoft 對 __cdecl 函數的處理上是不同的。

通常,他們對 __stdcall 函數也不同,因為 MSVC 修飾 __stdcall 函數,但我們可以通過添加一個 DEF 文件到 MSVC 工程裡來阻止這種行為。參見下載部分的例子有 DEF 文件的例子。其它關於代碼要注意的事情是 new_CFoo 函數返回一個指向 CFoo 對象的指針。BCB 調用者必須在本地保存這個指針。這可能看起來和這篇文章的主題有點矛盾。

畢竟,我想 BCB 不能使用來自 MSVC DLL 的 C++類?如果那是正確的,那麼為什麼我們還要返回一個 CFoo 對象指針呢?答案是 BCB 不能調用 MSVC DLL 導出類的成員函數。但是,這並不意味著它不能存儲這樣對象的地址。new_CFoo 返回的是一個 CFoo 對象的指針。

BCB 客戶端可以存儲這個指針,但不能用。BCB 不能廢棄它不應當嘗試這麼做)。讓這個觀點更容易理解一點,new_CFoo 返回一個空指針(總之它不能返回別的什麼東西)。在 BCB 這邊,除了存儲它,然後把它傳回給 DLL,沒有什麼可以安全地處理這個空指針的方法。

Ok,在我們繼續前進之前,還有另外兩個要十分注意的地方。首先,注意 CFoo_DoSomething 把空指針作為它的第一個參數這個空指針與 new_CFoo 返回的是同一個空指針。空指針用 reinterpret_cast 被追溯到 CFoo 對象(你知道,當你看到一個 reinterpret_cast 的時候。

你正在處理是難看的代碼)。DoSomething 成員函數在轉換之後被調用。最後注意空指針也是C++的參數。包裝 DLL 刪除對象是至關緊要的。你不應當在 BCB 裡對空指針調用 delete。顯然它不會按你想的去做。

  1. C與C++中標准輸入實現方式上的一點區別
  2. C++編譯器如何對Const常量進行分配存儲空間
  3. C++類庫設計的基本構思與方法
  4. 玩轉C++語言的幾種方法
  5. 如何更好的進行C++代碼編制

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved