Я просмотрел документы, объясняющие, как вызвать С++ из D, описанного здесь: 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, как показано ниже:
extern (C++) {
interface D {
int bar(int i, int j, int k);
}
D getD();
}
void main() {
D d = getD();
d.bar(9,10,11);
}
Мне не совсем понятно, как удалить объект С++. Вызывает ли вызов сборщика мусора D на объекте С++ или нам нужно предоставить функцию "deleter", которая удаляет объект и вызывает его вручную из D? Мне кажется, что если я добавлю деструктор в класс С++, он никогда не будет вызван. Также я заметил, что класс С++ должен объявлять функции-члены в том же порядке, что и в интерфейсе D (например, если я добавляю деструктор перед методом bar(), объект С++ не может быть вызван из D, но если деструктор объявлен после метода bar(), все работает нормально).
Также, если интерфейс D определяется как:
extern(C++){
interface D{
int bar();
int foo();
}
}
И соответствующий С++ класс задается:
class D{
public:
virtual int bar(){};
virtual int foo(){};
};
Как вы можете гарантировать, что виртуальные методы С++ vtbl будут созданы в том же порядке, что и методы, объявленные в интерфейсе D. Для меня нет никакой гарантии. Другими словами, как мы можем быть уверены, что D:: bar() будет в первой позиции в vtbl? Разве это не зависит от реализации/компилятора?