c 和Python互操作高階應用(5)

2021-04-20 07:01:57 字數 1896 閱讀 8370

把我在實際過程中遇到的問題,總結一下,請先閱讀:python教程,

python faq

1.如果封裝的c++類沒有拷貝建構函式怎麼辦?

定義class的時候,加入模板引數boost::noncopyable,同時指定no_init

class_("expandemitter",no_init);

拷貝構造的目的是,c++物件例項傳遞給python時,可以通過拷貝構造重新構造乙個python中使用的物件例項。一般如果沒有拷貝構造,需要boost的share_ptr來傳遞共享指標。

2.封裝的c++函式如何返回指標或者引用?

return_value_policy(),返回值策略設定為return_by_reference即可

.def("getpostdata",&request::getpostdata,return_value_policy()) 

3.自定義的string怎麼和python進行自動轉換?

4.物件釋放的問題

假如在c++中建立的物件,在python中怎麼釋放?或者在python中建立的物件,在c++怎麼釋放?

我的看法是,在一種語言中建立並釋放。如果你想在python中建立物件,可以呼叫c++的函式,比如newclass()來建立,返回乙個指標或者引用,使用完畢,呼叫c++的deleteclass()來釋放。否則,python引用計數會特別麻煩,很容易導致記憶體洩漏等問題。

5.共享指標,怎麼手工釋放?

共享指標,預設是自動釋放的,但是有時候,我們並不需要自動釋放,想自己手工釋放,可以定義乙個釋放函式,在建立共享指標的時候,傳入釋放函式指標。

//定義

typedef boost::shared_ptr < world > world_ptr;

//定義乙個釋放函式

void deleteworld(world* w);

//共享指標,傳入釋放函式指標

world_ptr worldobjectptr (new world,deleteworld);

6.c++封裝模組,多個檔案include,怎麼會有多重定義的問題?

boost_python_module(hello)

如果上面這段在.h檔案中,多個cpp檔案引用是不行的。這個時候,可以定義乙個標頭檔案如下

extern

"c"void inithello();

你在標頭檔案中首先宣告inithello(),在把上面的移到cpp中,boost_python_module會實現乙個函式inithello(),這樣就可以了。

7.如何封裝c++容器?

boost/python/suite/indexing目錄下的標頭檔案

//include

#include 

//定義模組時,可以定義map

//string map

boost::python::class_>("strmap")

.def(map_indexing_suite>())

本人研究過一段時間並在實際專案中應用,寫出這個系列希望對大家有幫助。

系列文章:

python呼叫c/c++函式(1)

python呼叫採用boost python封裝的c++(2)

c++呼叫python(3)

c++呼叫python(4)

c++和python互操作高階應用(5)

C 平台互操作大全

新增引用using system.runtime.interopservices dllimport user32.dll charset charset.unicode windows dllimport coredll.dll charset charset.unicode mobile pub...

C 互操作性

互操作性使您能夠保留和利用在現有非託管 中的投入。託管 執行在公共語言執行庫 clr 的控制之下的 非託管 執行在 clr 之外的 稱為 非託管 com com c 元件 activex 元件 和 win32 api 都是非託管 的示例。為什麼要使用互操作性呢?net 是建立在作業系統的之上的乙個開...

C 嵌入互操作型別

嵌入互操作型別 embed interop types 運用office程式設計呼叫excel 的pia時microsoft.office.interop.excel.dll時會產生如下問題 1.提示錯誤 未能載入檔案或程式集 microsoft.office.interop.excel.dll 2...