<h2>一。解决问题的总体思路:</h2>
<h3>(1) 是的。定义一个名为回调的C++类,它具有方法Run()
<h3>(2) 是的。在Python代码中继承回调,并创建一个实例。</h3>
<h3>(3) 是的。使用C++方法将实例绑定到C++点子。
<h3>(4) 是的。使用指针访问在python代码中定义的run()。</h3>
<h2>2。示例代码</h2>
<h3>(1) 是的。示例.h</h3>
<pre><code>class Callback{
public:
virtual void run(int n);
virtual ~Callback() {};
};
extern Callback * callback;
extern void doSomeWithCallback();
extern void setCallback(Callback * cb);
</code></pre>
<h3>(2) 是的。示例.cxx</h3>
<pre><code>#include <iostream>
#include "example.h"
int n=0;
Callback * callback = NULL;
void Callback::run(int n){
std::cout << "This print from C++: n = " << n << std::endl;
}
void setCallback(Callback * cb){
callback = cb;
}
void doSomeWithCallback(){
if(callback == NULL){
std::cout << "Must set callback first!" << std::endl;
}else{
callback->run(n++);
}
}
</code></pre>
<h3>(3) 是的。示例i</h3>
<pre><code>/* File : example.i */
%module(directors="1") example
%{
#include "example.h"
%}
/* turn on director wrapping Callback */
%feature("director") Callback;
%include "example.h"
</code></pre>
<h3>三。编译</h3>
<pre><code>$ swig -c++ -python example.i
$ g++ -c -fPIC example.cxx example_wrap.cxx -I/usr/include/python2.7/
$ g++ -shared example.o example_wrap.o -o _example.so
</code></pre>
<h3>四。在python shell中使用</h3>
<pre><code>In [1]: import example
In [2]: example.doSomeWithCallback()
Must set callback first!
In [3]: callback = example.Callback()
In [4]: example.setCallback(callback)
In [5]: example.doSomeWithCallback()
This print from C++: n = 0
In [6]: class Callback(example.Callback):
...: def run(self, n):
...: print 'This print from Python: n =', n
...:
In [7]: callback = Callback()
In [8]: example.setCallback(callback)
In [9]: example.doSomeWithCallback()
This print from Python: n = 1
</code></pre>
<h3>5个。其他</h3>
<p>我想你还需要更多的东西。尝试:</p>
<pre><code>$ ls swig-x.x.x/Examples/python
</code></pre>