如何使用 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 的构造函数是不正确的。我一直都是对的。
我有两个 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 的构造函数是不正确的。我一直都是对的。