2016-05-26 40 views
0

我想讓我的項目符合GCC鏈接與MSVC編譯的庫(我沒有來源)。問題是這個庫也存在於x86 x86,x86_64和使用GCC編譯的arm平臺上(我的項目是跨平臺的),我不想寫很多依賴於平臺的(和編譯器相關的)代碼。此外,與項目鏈接的其他庫被設計爲由GCC編譯(如ffmpeg和vlc),我不可能遷移到MSVC。 爲此,我編寫了C風格的包裝庫(基於原始標頭)。從指針C++構造

構造函數和析構函數的類完成這樣:

__declspec(dllexport) void* myClass_myClass() 
{ 
    void* ptr = new myClass(); 
    return ptr; 
} 
__declspec(dllexport) void myClass_unmyClass(void* ptr) 
{ 
    delete((myClass*)ptr); 
} 

這部分編譯MSVC並鏈接到原始庫。正如你所看到的(我可以在依賴walker中看到它),我有可以與GCC鏈接的c樣式導出。它分配內存,創建對象並按設計行事。

現在我正在寫這個包裝類的第二部分,它將包含類,並將與GCC一起編譯並鏈接到我的項目。它應該基於庫的原始頭文件(以確保它與這個庫的linux和windows版本的原始版本相同)。我懷疑如何構造類和類的構造函數和析構函數。 假設我們有

class MyClass 
{ 
public: 
    MyClass() 
    ~MyClass() 
} 

在原始標題。

如何在.cpp中定義繞過對我的c風格「consturctor」和「析構函數」的調用(以便它們將繞過對原始構造函數和析構函數的調用)? 在構造函數中分配指向this的指針會很好,但是它是被禁止的。

P.S.我沒有內部的課程。他們都有

private: myClassImpl* m_pImpl; 

所以我不能使用複製構造函數。即使我可以 - 我不想構建2次相同的對象。

+0

你是什麼意思的「旁路」?也沒有理由使用'void *'。使用'MyClass *'。如果你需要它被純C所理解,你可以使用'struct MyClass *'(或者使用typedef)。 – ymett

+0

@ymett我的意思是調用我的C風格「構造函數」以某種方式形成myClass的原始構造函數,並將返回的指針作爲指向創建的類的指針。 也許你正確的使用'myClass *'而不是'void *',但是如果C中沒有「指向類的指針」這樣的事情怎麼辦? – ElDorado

+0

我不認爲「繞過」是你想要的單詞。 struct和class在C++中是相同的,C具有指向struct的指針。 – ymett

回答

1

您的包裝類應該是一個句柄類,它在構造函數中調用myClass_myClass(),將返回的指針存儲爲成員,並在存儲的指針的析構函數中調用myClass_unmyClass()。應該將原始類中的所有成員函數複製到包裝中,但只需在存儲的指針上調用原始函數(通過包裝器「C」函數)即可。小心使用複製構造函數和複製賦值操作符 - 默認值不會做正確的事情。您必須刪除它們或實施它們以調用適當的包裝「C」功能。

+0

這是一個很好的解決方案,我想過了。但是這個想法並不是要改變庫的原始頭文件(因爲正如我所說的那樣,這個庫的linux版本具有相同的類,可以很好地工作)。 但是!也許我可以使用myClassImpl * m_pImpl變量來存儲這個指針。 這會調用2次構造函數(一個用於包裝類,另一個用於原始類),但我試圖避免它,但無論如何它可能會做到這一點。 – ElDorado