如何解决在python中,我使用Base的派生类,它是由SWIG包装的Base类,但由于错误信息而失败:类型为'Base *'的参数2
// a.h
class A
{
public:
void register(Base*);
}
// a.cpp
void A::register(Base* pBase)
{
pBase->run();
}
// Base.h
class Base
{
public:
virtual void run()=0;
}
然后,我使用SWIG 3.0将A类的功能寄存器与模块包装在一起。
// module.i
%module(directors=1) myModule
%{
#include "a.h"
#include "Base.h"
#include <boost/shared_ptr.hpp>
%}
%include <boost_shared_ptr.i>
%shared_ptr(Base)
%include "a.h"
%feature("director") BaseCase; // force no abstract for BaseCase
%include "Base.h"
然后,我在python中使用Base的派生类,但由于错误信息而失败:类型为'Base *'的参数2
# deriveClass.py
class deriveClass(myModule.Base):
def __init__(self):
myModule.Base.__init__(self)
def run(self):
print('derived class')
测试脚本如下:
test.py
import myModule
import deriveClass
a=myModule.A()
a.register(deriveClass.deriveClass()) # error found here.
解决方法
好吧,在引用Wiki(http://www.swig.org/Doc1.3/Typemaps.html)之后 我修好了它。 我举一个例子,如下:
// a.cpp
#include "a.h"
void A::re(Base* pBase)
{
// pBase->run();
baseList.push_back(pBase);
}
void A::notifyrun()
{
vector<Base*>::iterator iter = baseList.begin();
for (; iter != baseList.end();iter++)
{
(*iter)->run();
}
}
// a.h
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
virtual void run()=0;
};
class A
{
public:
void re(Base* pBase);
void notifyrun();
private:
vector<Base*> baseList;
};
// module.i
%module(directors=1) myModule
%{
#include "a.h"
#include <iostream>
#include <boost/shared_ptr.hpp>
%}
%include "std_string.i"
%include "std_map.i"
%include <boost_shared_ptr.i>
%shared_ptr(Base)
%feature("director") Base; // force no abstract for BaseCase
%include "a.h"
// test script
import sys
sys.path.append(".")
import myModule
class deriveClass(myModule.Base):
def __init__(self):
myModule.Base.__init__(self)
def run(self):
print('derived class')
deriveClass = deriveClass()
deriveClass.run()
a = myModule.A()
a.re(deriveClass)
a.notifyrun()
首先,使用以下命令编译a.o:
g++ -fPIC -o a.o -c a.cpp
其次,使用swig生成包装文件。
swig -c++ -python module.i
最后,构建一个_myModule.so
g++ -fPIC -Wall -Wextra -shared a.o -o _myModule.so module_wrap.cxx -I/usr/include/python2.7 -lpython2.7
现在,您可以在python中运行脚本
python deriveClass.py
derived class
derived class
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。