2014-09-21 89 views
0

我有类似的东西在C++文件中,组成我痛饮模块:SWIG C++/Python的:继承代理对象

class CObject { 
    public: 
     void do() { 
      // some treatments 
     } 
}; 
class Interface { 
    public: 
     void add(CObject* obj) { 
      obj->do(); 
     } 
}; 

在Python代码,即使用我痛饮模块,有这样的事情:

from mySwigModule import Interface, CObject 

class MyObj(CObject): 
    def __init__(self): 
     super(CObject, self).__init__() 


inter = Interface() 
inter.add(MyObj()) // ERROR 

此代码是非常基本的。真正的一个处理较大的对象。 但问题是:运行Python代码时,类似的东西印:

NotImplementedError: Wrong number or type of arguments for overloaded function 'Interface_add'. 
Possible C/C++ prototypes are: 
    Interface::add(CObject *) 

我如何解释痛饮如何在CObject的投的对象?

当然这与类型地图有关,但我不知道具体是什么。 我尝试添加该接口文件,没有成功:

%typemap(in) CObject * { 
    if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor)) == -1) { 
     $1 = (CObject *) $1; 
     } 
} 

在编译返回的错误是一样的东西:

error: macro "SWIG_ConvertPtr" requires 4 arguments, but only 3 given 
In function ‘PyObject* _wrap_Interface_add__SWIG_0(PyObject*, PyObject*)’: 
error: ‘SWIG_ConvertPtr’ was not declared in this scope 

在实际的代码,接口:: Add()方法被调用2参数。也许typemaps需要指定其他参数的类型?

的Debian,蟒3.2,SWIG 2.

编辑:真正的错误是展示。

+1

我已经在与Python过去的一些问题,删除我痛饮对象。你可以试试:'my_obj = MyObj()',然后调用'inter.add(my_obj)'。 – MasterMind 2014-09-22 15:28:42

+0

经过测试后,即使我在使用'mySwigModule'的类的类属性中存储'my_obj',它也不会改变任何内容。但是,当我把它放在一个全局变量中时,C++代码拒绝这个对象,因为它不是一个CObject类型:NotImplementedError:错误的数字或者重载函数参数的类型'Interface_add' – aluriak 2014-09-23 09:44:34

+0

这可能是一个错字,但是这一行在你的.h中似乎是错误的:'void add(CObjects * obj)'还有一个's'。 – MasterMind 2014-09-23 12:31:20

回答

1

您的__init__有错误。试试这个:

def __init__(self): 
    super(MyObj, self).__init__() 

,甚至这样的:

def __init__(self): 
    super().__init__() 

完整的测试:

/* example.i */ 
%module example 
%inline %{ 
class CObject { public: void do_it() {} }; 
class Interface { public: void add(CObject* obj) {obj->do_it();} }; 
%} 
# test.py 
from example import Interface, CObject 

class MyObj(CObject): 
    def __init__(self): super(MyObj, self).__init__() 

Interface().add(MyObj()) 
$ # build and test procedure 
$ swig -o example_wrap.cc -python -c++ example.i 
$ g++ -o example_wrap.os -c -fPIC -I/usr/include/python3.4 example_wrap.cc 
$ g++ -o _example.so -shared example_wrap.os 
$ python3 test.py 
$ 
+0

它的可怕;对此感激不尽 !总成功。再次感谢 ! – aluriak 2014-10-06 18:07:38