在 python 中,我使用 Base 的派生 class,它是 SWIG 包装的 Base class,但失败并显示错误信息:'Base *' 类型的参数 2
in python, I use derived class of Base which is a Base class wrappered by SWIG, but failed with error info: argument 2 of type 'Base *'
// 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 用 module.i
包装这个 Class 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 的派生 class,但失败并显示错误信息:'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.
嗯,参考维基之后(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编译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
// 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 用 module.i
包装这个 Class 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 的派生 class,但失败并显示错误信息:'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.
嗯,参考维基之后(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编译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