如何使用 SWIG 将 Python 类实例作为 C++ 函数的参数传递

how to pass python class instance as a parameter of c++ fuction using swig?

本文关键字:C++ 函数 参数传递 实例 SWIG 何使用 Python      更新时间:2023-10-16

我正在尝试使用 swig 将 C++ 类接口翻译成其他语言。我的 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++ 中,我可以像这样使用这个接口:

这是文件测试.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 类实例传递给 SWIG 包装的 C++ 接口时它崩溃了。 有人有任何帮助吗?

有两个

关键方面:

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