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

标签 python c++ vector swig stdvector

我有两个 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/

相关文章:

python - 通过 Python 在 Firefox 中运行 iMacros

在 R 中重构向量

c++ - 欧拉计划 #3 (C++)

r - 在R中创建随机向量列表

c++ - 如何删除尚未分配给对象的指针

python - 如何在 Django 中编辑和删除数据?

Python:必须导入非内置异常才能捕获它们吗?

python - Apache Airflow 中调度程序间隔和启动时间的工作不正确

c++ - 延迟执行小部件程序

c++ - 实现一个Windows资源管理器扩展 View 界面