其他分享
首页 > 其他分享> > 我如何用Swig包装器在C类指针上调用方法?

我如何用Swig包装器在C类指针上调用方法?

作者:互联网

我正在使用SWIG包装C代码以在Python测试框架中使用.我的问题是,我得到一个指向类实例的指针,然后需要在该实例上调用方法.例如,在我的Swig文件example.i中:

iExample* getMyClassInstance();

...

class iExample
{
    public:
        virtual void somePureVirtualMethod() = 0;
// ...
};

现在,在python中,如果我有该类,则可以调用该方法

myClassInstance.somePureVirtualMethod()

但是,我当然没有该类的实例.我有一个从SWIG生成的不透明指针.如何使用?显然在Python中我做不到

myClassInstancePtr = example.getMyClassInstance()
myClassInstancePtr->somePureVirtualMethod()

我尝试在swig中使用cpointer.i或pointer.i来生成指针函数,但这不好,因为它试图创建类的副本.这甚至不能使用带有纯虚方法的接口进行编译,即使我没有使用纯虚方法,我也不想创建该类的副本,而只想在其上调用某些东西!

解决方法:

SWIG可以很好地解决这一问题.确保在SWIG中定义了接口,然后该接口将是不透明的.这是一个工作示例:

%module x

%inline %{

// Define the interface.
struct iExample
{
    virtual int somePureVirtualMethod() = 0;
};

iExample* getMyClassInstance();

%}

// Implementation, not exposed to Python
%{
struct Internal : public iExample
{
    int somePureVirtualMethod() { return 5; }
};
iExample* getMyClassInstance() { return new Internal(); }
%}

演示:

>>> import x
>>> i = x.getMyClassInstance()
>>> i.somePureVirtualMethod()
5

但是,此实现将泄漏内部实例.您可能想要实现一种自动释放它的方法.一种方法是使用%newobject并定义虚拟析构函数.没有更多引用时,Python将删除该对象.

%module x

%newobject getMyClassInstance;

%inline %{
struct iExample
{
    virtual ~iExample() {};
    virtual int somePureVirtualMethod() = 0;
};
iExample* getMyClassInstance();
%}

// Implementation
%{
#include <iostream>
struct Internal : public iExample
{
    int somePureVirtualMethod() { return 5; }
    ~Internal() { std::cout << "destroyed" << std::endl; }
};
iExample* getMyClassInstance() { return new Internal(); }
%}

演示:

>>> import x
>>> i = x.getMyClassInstance()
>>> i.somePureVirtualMethod()
5
>>> i=2       # reassign i
destroyed     # garbage-collected

标签:swig,python,c-4
来源: https://codeday.me/bug/20191122/2056138.html