我需要将Fortran和C ++混合在一起。 我写过C ++类。由于extern“C”函数调用C ++库,我能够调用C ++公共函数。
此函数创建此C ++ classe的一些实例。当这个函数结束时,我希望将这些实例保留在内存中以便在之后调用它们。但是破坏我的实例会被自动调用。
我不想在Fortran中使用这些实例,而是在其他包装的C ++函数中使用它们。 我不能使用iso_c_binding或任何Fortran 2003函数(不幸的是)。
你有什么简单的想法让实例留在记忆中吗?
提前致谢。
答案 0 :(得分:1)
如果要在下次输入相同的函数时再次访问相同的C ++对象,可以在函数内将它们声明为static
。
这将使函数的每次调用共享同一组(静态)变量。
如果多个函数需要访问同一个对象,则可以在命名空间作用域中定义它们(在任何函数或类之外)。访问对象的函数的所有调用都将共享相同的全局变量。
如果你不希望隐式共享通过使它们成为全局或static
而隐含的实例,那么最好的选择(无论如何最好的选择)是在类的周围用create /编写一个C包装器销毁动态分配类实例的函数。
例如:
// 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();
}