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;  
  23.   } 

这里有几个比较重要的地方要注意。首先,注意每一个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++代码编制
责任编辑:chenqingxiang 来源: CSDN
相关推荐

2010-01-26 10:42:26

C++函数

2010-01-18 13:54:28

函数

2010-01-14 17:08:10

C++日期

2010-01-27 10:22:53

C++基类

2010-02-02 18:14:38

Python函数

2010-01-28 13:27:12

C++类定义

2010-01-19 13:43:59

C++函数

2010-01-05 16:07:46

jQuery.prot

2011-07-06 10:14:46

C#

2010-01-18 15:53:27

C++析构函数

2010-01-19 18:35:12

静态成员

2010-01-27 10:13:22

C++类对象

2010-01-25 14:00:27

C++类

2011-07-12 11:15:46

C++

2010-01-14 17:42:47

CC++

2010-01-26 13:42:28

C++指针

2010-01-25 10:54:18

C++设计

2011-02-23 10:21:18

ProFTPd参数

2011-02-25 09:56:30

Proftpd

2011-11-28 15:26:40

Nginx配置
点赞
收藏

51CTO技术栈公众号