4
Dでクラスを実装してC++にエクスポートしようとしました。 thisチュートリアルの例との違いで、私はC++の寿命をコントロールしたいと思っています。 私は、Dでファクトリメソッドを呼び出すこと、インスタンスを作成すること、gcRootとしてマークして返すことができると考えました。 C++がこのクラスをもはや必要としなくなると、Dの関数を呼び出してインスタンスをGCRootとしてマークを解除します。 C++はDでクラスを実装し、C++でinstanciate/lifetimetrackを実装します
D-コードからのカウント関数を呼び出すときに、次のコードはSIGSEGVでコンパイルが、結果:
import core.memory;
extern (C++) interface B {
public:
extern (C++) int count();
private:
}
class D : B {
extern (C++)int count() { return 10; }
};
extern (C++) B* CreateB() {
B inst = new D();
B* instPtr = &inst;
core.memory.GC.addRoot(instPtr);
return instPtr;
}
C++コード:
class B {
public:
virtual int count();
};
B* CreateB();
extern "C" int rt_init();
int main(int argc, char *argv[])
{
rt_init();
B* b = CreateB();
int i = b->count();
return 0;
}
ありがとうございました!今働く.... –