Мне нужно смешать Фортран и С ++ вместе.
Я написал класс C ++. Я могу вызывать открытую функцию C ++ благодаря функции extern «C», которая вызывает библиотеку C ++.
Эта функция создает несколько экземпляров этого класса C ++. Когда эта функция заканчивается, я хочу сохранить эти экземпляры в памяти, чтобы вызывать их после. Но уничтожение моих экземпляров вызывается автоматически.
Я не хочу использовать эти экземпляры с Fortran, но использовать их в другой обернутой функции C ++.
Я не могу использовать iso_c_binding или любую функцию Fortran 2003 (к сожалению).
У вас есть какие-нибудь простые идеи сохранить экземпляры в памяти?
Заранее спасибо.
Если вы хотите снова получить доступ к тем же объектам 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();
}
Других решений пока нет …