2017-10-11 116 views
1

我想使用swig將C++類接口轉換爲其他語言。 我的C++接口是這樣的:如何使用swig將python類實例作爲C++函數的參數傳遞?

這是文件mitprotocol.h

class MitProtocolCallBack 
{ 
public: 
    virtual const string & TestFunc(deque<int> & param) = 0; 
}; 

class MitProtocolInterface 
{ 
public: 
    virtual void ReleaseMe() = 0; 
    virtual void SetCallBack(MitProtocolCallBack * mitProtocolCallBack) = 0; 
    virtual void UnTar(const string & filePathAndName) = 0; 
}; 

MitProtocolInterface * CreateMitProtocolInterface(); 
在C++

,我可以用這個接口是這樣的:

這是文件TEST.CPP:

class testclass : public MitProtocolCallBack 
{ 

public: 
    void playhaha() 
    { 
     mitProtocolInterface->UnTar(""); 
    } 
private: 
    string str_res; 

public: 
    virtual const string & TestFunc(deque<int> & param) 
    { 
     str_res = "abc"; 
     return str_res; 
    } 
private: 
    MitProtocolInterface * mitProtocolInterface; 

public: 
    testclass() 
    { 
     mitProtocolInterface = CreateMitProtocolInterface(); 
     mitProtocolInterface->SetCallBack(this); 
    } 
    ~testclass() 
    { 
     mitProtocolInterface->ReleaseMe(); 
    } 
}; 

void main() 
{ 
    testclass haha; 
    haha.playhaha(); 
} 

然後我試着用swig包裝C++接口:

這是文件mitprotocol.i:

%module mitprotocol 

%include "std_string.i" 

%include "std_deque.i" 

%{ 
#include "mitprotocol.h" 
%} 

namespace std { 
    %template(IntDeque) deque<int>; 
} 

%include "mitprotocol.h" 

然後我執行:

swig -c++ -python mitprotocol.i 

然後我得到2個文件:

file mitprotocol.py: for python interface 
file mitprotocol_wrap.cxx: to compile with other c++ source codes as a lib 

然後我試圖使用Python接口:

這是文件test.py:

import mitprotocol 

class myclass(mitprotocol.MitProtocolCallBack): 
    def __init__(self): 
     self.mitProtocolInterface = mitprotocol.CreateMitProtocolInterface() 
     self.mitProtocolInterface.SetCallBack(self) 

    def __delete__(self): 
     self.mitProtocolInterface.ReleaseMe() 

    def TestFunc(self, param): 
     print param 
     return "aedfas" 

    def playhaha(self): 
     self.mitProtocolInterface.UnTar("") 

ffsa = myclass() 
ffsa.playhaha() 

,最終我獲得了線上的埃羅:

self.mitProtocolInterface.SetCallBack(self) 

的錯誤是:

TypeError: in method 'MitProtocolInterface_SetCallBack', 
argument 2 of type 'MitProtocolCallBack *' 

我想試圖通過Python類實例時痛飲包裹C++接口它墜毀。任何人有任何幫助?

+0

我想通它本人,請檢查這些問題的答案 –

回答

2

有2個重要方面:

1.新增多態性.i文件:

%module(directors="1") mitprotocol 

%include "std_string.i"; 

%include "std_deque.i"; 

%{ 
#include "mitprotocol.h" 
%} 

namespace std { 
    %template(IntDeque) deque<int>; 
} 

%feature("director") MitProtocolCallBack; 

%include "../../mitprotocol/src/traffic/mitprotocol.h"; 

2.python應用需要呼叫超類的初始化時初始化:

import mitprotocol 

class myclass(mitprotocol.MitProtocolCallBack): 
    def __init__(self): 
     mitprotocol.MitProtocolCallBack.__init__(self) 
     self.mitProtocolInterface = mitprotocol.CreateMitProtocolInterface() 
     self.mitProtocolInterface.SetCallBack(self) 

    def __delete__(self): 
     self.mitProtocolInterface.ReleaseMe() 

    def TestFunc(self, param): 
     print param 
     return "aedfas" 

    def playhaha(self): 
     self.mitProtocolInterface.UnTar("") 

ffsa = myclass() 
ffsa.playhaha() 
相關問題