我目前正在使用SWIG在我的主要C ++程序中更容易实现小模块。类架构如下:
foo.hpp:
class Foo
{
public:
virtual int pureFunc() = 0;
int func() { return (42); }
};
file.i:
%module(directors="1") foo
%feature("director") Foo;
%{
#include "foo.hpp"
%}
%include "foo.hpp"
file.py:
import sys
sys.path.append('.')
import foo
class Bar(foo.Foo):
def __init__(self):
pass
def pureFunc(self):
return 21
lol = Bar()
print lol.pureFunc()
print lol.func()
然后我使用以下命令生成swig包装器:
swig -python -c++ file.i
并像这样编译.so:
g++ -fPIC -shared -o _foo.so file_wrap.cxx -I/usr/include/python2.7 -lpython2.7
当我尝试运行python脚本时,我收到以下错误:
# python file.py
21
Traceback (most recent call last):
File "file.py", line 13, in <module>
print lol.func()
File "/home/volent/dev/CPP/cython/foo.py", line 84, in func
def func(self): return _foo.Foo_func(self)
TypeError: in method 'Foo_func', argument 1 of type 'Foo *'
# _
这表明纯方法的使用正在起作用,但我不能使用已在.hpp文件中定义的方法。
我试过阅读SWIG文档,我看到的关于抽象类和继承的唯一内容是34.4.7 C++ Classes和34.4.8 C++ Inheritance。而且我看不到任何类似的案例。
答案 0 :(得分:1)
您忘记调用__init__
父类的Bar
方法。将__init__
方法替换为:
class Bar(foo.Foo):
def __init__(self):
super(Bar,self).__init__()
这应该让您的Bar
课程了解Foo
方法。