Общий способ - создать оболочку для каждого класса C ++ и метод для генерации указателей на эти оболочки, а другой - для их удаления.
extern "C" {
struct WA{
void* self;
};
struct WA* new_A( int p1 ){
WA* wa = new WA;
wa->self = new A( p1 );
return wa;
}
void delete_A( WA* wa ){
delete static_cast<A*>( wa->self );
delete wa;
}
}
Затем вы преобразуете каждый метод каждого класса в функциюпринимая указатель на структуру в качестве первого аргумента.A::getValue
становится
int A_getValue( WA* wa) {
return static_cast<A*>( wa->self )->getValue();
}
Экземпляры могут передаваться через указатель, поэтому B::DoSomething
становится
void B_DoSomething( WB *wb, WA *param1){
static_cast<B*>( wb->self )->DoSomething( *static_cast<A*>( param1->self ) );
}
Аналогично, вы можете возвращать экземпляры по указателю.C::SetSomething
затем становится
struct WA* C_SetSomething( WC* wc, int value ){
A a = static_cast<C*>( wc->self )->SetSomething( value );
return new_A( a.getValue() );
}
Вы должны быть очень осторожны с управлением памятью в C-коде.Смотри рабочий пример здесь .