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

2024-09-30 08:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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++接口:

这是文件协议。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

然后我得到了两个文件:

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

然后我尝试使用python接口:

这是一个文件测试.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++接口时崩溃了。有人帮忙吗?你知道吗


Tags: 文件selfstringparamvirtualpublicclassswig
1条回答
网友
1楼 · 发布于 2024-09-30 08:28:31

有两个关键方面:

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应用程序需要在init:

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

相关问题 更多 >

    热门问题