我已经阅读了这里讲解如何从 D 语言中调用 C++ 的文档:http://dlang.org/cpp_interface.html,但还有一些事情不是很清楚。
以 D 语言网站提供的示例为例:
#include <iostream>
using namespace std;
class D {
public:
virtual int bar(int i, int j, int k)
{
cout << "i = " << i << endl;
cout << "j = " << j << endl;
cout << "k = " << k << endl;
return 8;
}
};
D *getD() {
D *d = new D();
return d;
}
然后可以像下面展示的那样,从 D 中调用 C++ 类:
extern (C++) {
interface D {
int bar(int i, int j, int k);
}
D getD();
}
void main() {
D d = getD();
d.bar(9,10,11);
}
我不太清楚的是,C++对象是如何被删除的。D语言的垃圾回收器是否会调用C++对象的delete,还是我们需要提供一个“删除器”函数来手动删除对象并在D中调用它?如果我向C++类添加析构函数,好像它从未被调用过。此外,我还注意到C++类必须以与它们在D接口中声明的顺序完全相同的顺序声明成员函数(例如,如果我在bar()方法之前添加了析构函数,则无法从D中调用C++对象,但如果在bar()方法之后声明析构函数,则一切正常)。另外,如果D接口定义为:
extern(C++){
interface D{
int bar();
int foo();
}
}
相应的C++类如下:
class D{
public:
virtual int bar(){};
virtual int foo(){};
};
你如何确保C++虚函数表(vtbl)的创建顺序与D接口中声明方法的顺序相同?对我来说,这没有任何保证。换句话说,我们如何确保D :: bar()将出现在vtbl的第一个位置?这不是取决于实现/编译器吗?
interface D{ void foo(); }
- BigONotation