如何使用swig将python类实例作为C++函数的参数传递?

问题描述:

我想使用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个重要方面:

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()