我有两个 C++ 类:Foo 和 Bar。 Foo 的构造函数如下所示:
Foo(std::vector<Bar *> * bars);
Bar 的构造函数及其成员函数之一如下:
Bar(int data)
int getData()
在我的界面文件中,我有:
%module mySwig
%{
#include "Foo.h"
#include "Bar.h"
#include <vector>
%}
%include "Foo.h"
%include "Bar.h"
%include "std_vector.i"
namespace std {
%template(VectorOfBars) vector<Bar *>;
}
然后在 python 中我执行以下操作:
import mySwig
myBar = mySwig.Bar(5)
现在我需要创建一个 std::vector<Bar *> *
对象传递到 Foo 构造函数中,所以我尝试以下操作:
vector = mySwig.VectorOfBars()
vector.push_back(myBar)
为了测试这是否成功,我尝试:
print vector
print vector[0]
print vector[0].getData()
如果第三次打印的结果仍然是“5”,那么它就成功了,但我得到的是我假设的指针值
<mySwig.VectorOfBars; proxy of <Swig Object of type 'std::vector< Bar *,std::allocator< Bar * > > *' at 0xb6a9c4d0> >
<mySwig.Bar; proxy of <Swig Object of type 'std::vector< Bar * >::value_type' at 0xb6a9c3b0> >
3069958048
我做错了什么?如何创建需要传入的 Bar 指针对象 vector 来创建 Foo 对象?为什么我得到的是指针值而不是实际值?
最佳答案
我明白了!问题是类型 <mySwig.Bar; proxy of <Swig Object of type 'std::vector< Bar * >::value_type' at 0xb6a9c3b0> >
翻译为 Bar *
而不是Bar
目的。通常 SWIG 会为您处理指针,但在本例中,当我在 Bar *
上调用方法时,情况并非如此。反对它给了我虚假数据。
实际上,这正是我需要传递给 Foo 构造函数的内容。我只是错误地认为 SWIG 会自动取消对 Bar 指针的引用,以便我可以访问它的 data
属性。当我更改模板声明时
%template(VectorOfBars) vector<Bar *>;
到线
%template(VectorOfBars) vector<Bar>;
然后我就可以访问 data
但随后传递给 Foo 的构造函数是不正确的。我一直都是对的。
关于python - 如何使用 SWIG Python 从 vector 内部访问 C++ 对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235490/