2016-02-05 3 views
1

У меня есть два класса C++: Foo и Bar. Конструктор Foo выглядит следующим образом:Как получить доступ к методам объектов C++ из внутреннего вектора с помощью SWIG Python

Foo(std::vector<Bar *> * bars); 

Конструктор для бара и одна из его функций-членов, являются следующие:

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 *>; 
} 

Итак, в питоне я делаю следующее:

import mySwig 
myBar = mySwig.Bar(5) 

И теперь мне нужно создать std::vector<Bar *> * объект передать в конструктор Foo, поэтому я стараюсь следующее:

vector = mySwig.VectorOfBars() 
vector.push_back(myBar) 

Чтобы проверить, было ли это успешным Стараюсь:

print vector 
print vector[0] 
print "data: 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? Почему я получаю значение указателя вместо фактического значения?

ответ

0

Я понял! Проблема заключалась в том, что тип <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 в. У меня было все правильно.