如何使用 SWIG Python 从 vector 内部访问 c++ 对象方法

How to access c++ object methods from inside vector with SWIG Python

我有两个 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 指针对象的向量以创建 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 的构造函数是不正确的。我一直都是对的。