2013-01-18 132 views
2

可能重複:
C++/CLI Mixed Mode DLL Creation包裝內聯函數

我包裝使用C++類C++ CLI。頭文件看起來是這樣的:

pabcon.h

class PABCon { 
private: 
     unsigned int maxIndex;  
     long byteSize; 
public: 
    __declspec(dllexport) inline unsigned int GetMaxIndex() { return this->maxIndex; }; 
    __declspec(dllexport) void invertData(); 
}; 

我包裹非內聯函數是這樣的:

pabconwrapper.h

public ref class PABConWrapper 
{ 
private: 
    PABCon *pabc; 

public: 
    PABConWrapper(); 
    ~PABConWrapper(); 
    void invertData(); 
}; 

pabconwrapper.cpp

PABConWrapper::PABConWrapper() : pabc(new PABCon()) 
{ 

} 

void PABConWrapper::invertData() 
{ 
    pabc->invertData(); 
} 

PABConWrapper::~PABConWrapper() 
{ 
    delete pabc; 
} 

我的問題是:

1)什麼是包裹直列 C++函數的最佳方式?

2)我應該如何處理pabcon.h中定義的私有變量?我是否應該以某種方式包裝它們?

謝謝

P.S.自4年前我已經觸摸過C++,並且從那時起用C#編碼。

+0

你是說C#與他們互操作嗎?你會做另一個函數來訪問私有變量,除非你計劃在類的字節周圍嗅探 – Jay

+0

@Jay,我需要c#中的那些內聯函數。 – VladL

+0

如果你只需要調用,就使用PInvoke。 請參閱http://stackoverflow.com/questions/10388405/how-to-make-cp-invoke-code-called-from-c-sharp-thread-safe – Jay

回答

2

inline:標記方法inline是編譯器不發出函數調用的指令,而是取出方法的內容並直接放入調用函數中。我相信這只是建議,編譯器可以選擇發出函數調用。無論如何,從C++/CLI調用這個函數時不需要做任何事情,所以在封裝它時不需要做任何事情。就像其他方法一樣包裝它。

私有變量:如果它們是私有變量,則使用PABCon的非託管C++代碼將無法訪問它們。 PABCon的公共接口只是公共方法,所以您只需要擔心。 (如果C++類有任何公共變量,那麼你會在C++/CLI創建一個屬性將它們包裝。)

~PABConWrapper:在C++/CLI,~不是析構函數,它的Dispose方法。正如現在所執行的那樣,如果你忘記處理你的新類,你將會發生內存泄漏。至少,將~切換爲!,然後聲明終結器。理想情況下,同時執行!~,刪除兩個方法中的非託管對象(使用適當的空檢查),並在其他方法中添加適當的空檢查。這將是一個很好的IDisposable的正確實施。

+0

特別感謝指向我destructors /終結者 – VladL