Смешанный язык 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();
}
Другие вопросы по тегам