温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++类包含函数有哪些

发布时间:2021-11-29 15:54:02 来源:亿速云 阅读:120 作者:iii 栏目:编程语言

这篇文章主要讲解了“C++类包含函数有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++类包含函数有哪些”吧!

C++类包含三个我们关心的函数:构造函数,析构函数,和所有重要的 DoSomething 函数,我们需要把每一个函数包裹成与其等价的C++函数,在这里拿出来和大家分享一下。

// original class  class CFoo  {  public:   CFoo(int x);   ~CFoo();   int DoSomething(int y);  };  // flattened C code  void* __stdcall new_CFoo(int x)  {   return new CFoo(x);  }  int __stdcall CFoo_DoSomething(void* handle, int y)  {   CFoo *foo = reinterpret_cast<CFoo *>(handle);   return foo->DoSomething(y);  }  void __stdcall delete_CFoo(void *handle)  {   CFoo *foo = reinterpret_cast<CFoo *>(handle);   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。显然它不会按你想的去做。

感谢各位的阅读,以上就是“C++类包含函数有哪些”的内容了,经过本文的学习后,相信大家对C++类包含函数有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI