2012-12-10 2 views
0

Fortran과 C++를 함께 사용해야합니다. C++ 클래스를 작성했습니다. C++ 라이브러리를 호출하는 extern "C"함수 덕분에 C++ 공용 함수를 호출 할 수 있습니다.혼합 언어 F77/C++ : C++ 인스턴스의 파기 피하기

이 함수는이 C++ 클래스의 인스턴스를 만듭니다. 이 함수가 끝나면, 나는 그 인스턴스를 메모리에 저장해두고 호출하기를 원한다. 하지만 파괴는 내 인스턴스가 자동으로 호출됩니다.

저는 이러한 인스턴스를 Fortran과 함께 사용하지 않고 다른 랩핑 된 C++ 함수에서 사용하려고합니다. iso_c_binding이나 Fortran 2003 기능을 사용할 수 없습니다 (불행히도).

메모리에 인스턴스를 유지하는 간단한 아이디어가 있습니까?

미리 감사드립니다.

+3

'new'? (또한, 이것이 포트란과 어떤 관련이 있습니까?) – melpomene

+0

스택에서 작성되고 함수가 완료되면 파기됩니까? 그들을 힙에 놓으십시오 ('new'를 사용합니다, 그러나 어떤 래퍼로 직접 사용하는 것을 피하는 것이 가장 좋습니다). 그런 다음 어딘가에 포인터를 저장하십시오. – BoBTFish

답변

1

같은 기능을 다음 번에 입력 할 때 동일한 C++ 오브젝트에 다시 액세스하려면이 기능을 기능 내에 static으로 선언 할 수 있습니다. 이렇게하면 함수를 호출 할 때마다 동일한 (정적) 변수 세트를 공유하게됩니다.

여러 개체가 같은 개체에 액세스해야하는 경우 네임 스페이스 범위 (모든 함수 또는 클래스 외부)에서 정의 할 수 있습니다. 객체에 액세스하는 모든 함수 호출은 동일한 전역 변수를 공유합니다.

전역 또는 static으로 암시 된 인스턴스의 암시 적 공유를 원하지 않는 경우 가장 좋은 옵션 (최상의 옵션)은 생성/삭제 기능이있는 클래스를 중심으로 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(); 
} 
+0

처음 두 옵션은 끔찍하지만 괜찮은 예제를 작성하여 답을 저장했습니다. 함수 정의가'extern "C"'(꼭 필요한 것은 아니지만,'x_wrapper.cpp'에'x_wrapper.h' 헤더를 포함하지 않기로 결정한 때는 절대로 알지 못합니다. , 신비한 링커 오류가 발생합니다. – rubenvb