Если это возможно, тогда ваши классы должны быть производными от структуры. Затем вы можете использовать указатели на эту структуру в коде C:
// C++ code
extern "C" struct Cfoo {};
extern "C" struct Cbar {};
class foo : public Cfoo {};
class bar : public Cbar {};
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
Это не является строго ошибкой, однако gcc по крайней мере предупреждает о конвертации между указателями с разными типами.
void foo (void) {
struct Cfoo * pf;
struct Cbar * pb;
pf = pb; // gcc warns
}
Если вы не можете наследовать, используйте аналогичную идею, но пусть структура C хранит указатель на объект C ++ и снова просто объявляет структуры в API C:
// C++ code
class foo {};
class bar {};
extern "C" struct Cfoo { foo * pFoo; };
extern "C" struct Cbar { bar * pBar; };
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
Недостатком здесь является то, что нужно заботиться о времени жизни объекта Cfoo и Cbar.