2012-12-10 47 views
0

我需要將Fortran和C++混合在一起。我寫過C++類。我可以通過調用C++庫的extern「C」函數調用C++公共函數。混合語言F77/C++:避免​​破壞C++實例

該函數創建此C++類的一些實例。當這個函數結束時,我想將這些實例保存在內存中,以便在之後調用它們。但是銷燬我的實例會自動調用。

我不想在Fortran中使用這些實例,而是在其他封裝的C++函數中使用它們。 我不能使用iso_c_binding或任何Fortran 2003函數(不幸的是)。

你有任何簡單的想法來保持內存中的實例嗎?

在此先感謝。

+3

'new'? (另外,這與Fortran有什麼關係?) – melpomene

+0

因此,它們是在堆棧上創建的,然後在函數完成時被銷燬?把它們放在堆上(使用'new',但最好避免直接用一些包裝器來使用它),然後在某處保存指向它們的指針。 – BoBTFish

回答

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(); 
} 
+0

前兩個選項是可怕的,但你通過寫一個體面的例子保存了答案。儘管如果函數定義也包含在'extern「C」中(不是絕對必要的,但是您永遠不知道何時由於某種原因決定不在'x_wrapper.cpp'中包含'x_wrapper.h'頭文件,導致神祕的鏈接器錯誤。 – rubenvb