2016-04-17 9 views
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; 
} 

答えて

4

あなたの問題は、そのDでありますクラスは既に参照型(ポインタ)なので、再度参照解除することはできません。

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(); 
    core.memory.GC.addRoot(cast(void *)inst); 
    return inst; 
} 
+0

ありがとうございました!今働く.... –

関連する問題