Смешанный язык F77/C++: избегать уничтожения экземпляра C++
Мне нужно смешать Фортран и С ++ вместе. Я написал класс C++. Я могу вызывать открытую функцию C++ благодаря функции extern "C", которая выполняет вызов библиотеки C++.
Эта функция создает несколько экземпляров этого класса C++. Когда эта функция заканчивается, я хочу сохранить эти экземпляры в памяти, чтобы вызывать их после. Но уничтожение моих экземпляров вызывается автоматически.
Я не хочу использовать эти экземпляры с Fortran, но использовать их в другой обернутой функции C++. Я не могу использовать iso_c_binding или любую функцию Fortran 2003 (к сожалению).
У вас есть какие-нибудь простые идеи сохранить экземпляры в памяти?
Заранее спасибо.
1 ответ
Если вы хотите снова получить доступ к тем же объектам C++ при следующем входе в ту же функцию, вы можете объявить их как static
внутри функции. Это заставит каждый вызов функции использовать один и тот же набор (статических) переменных.
Если нескольким функциям требуется доступ к одному и тому же объекту (ам), вы можете определить их в области пространства имен (вне какой-либо функции или класса). Все вызовы функций, которые обращаются к объектам, будут иметь одну и ту же глобальную переменную (и).
Если вы не хотите неявного совместного использования экземпляров, которое подразумевается, делая их глобальными или static
лучший вариант (лучший вариант в любом случае) - написать обертку C вокруг класса вместе с функциями create/destroy, которые динамически распределяют экземпляр класса. Например:
// x.hpp
class X {
public:
X(int);
void foo();
};
// x_wrapper.h
extern "C" {
void* create_x(int arg);
void destroy_x(void* anX);
void x_foo(void* anX);
}
// x_wrapper.cpp
#include "x.hpp"
#include "x_wrapper.h"
void* create_x(int arg) {
return new X(arg);
}
void destroy_x(void* anX) {
X* self = (X*)anX;
delete self;
}
void x_foo(void* anX) {
X* self = (X*)anX;
return self->foo();
}