SWIG в принципе поддерживает это просто отлично, на самом деле я не могу воспроизвести то, что вы видели, с кодом, который вы показали.Например, все это работает:
%module test
%inline %{
class Foo {
public:
Foo (int i) {}
};
class Bar {
public:
Bar(int i):foo(i)
{
}
Foo foo;
};
%}
При компиляции и запуске с SWIG 3.0.2 (что довольно давно в наши дни!) Позволяет мне запустить этот код Python:
import test
f=test.Foo(0)
b=test.Bar(0)
b.foo=f
print('Well that all worked ok')
Причина, по которой это может работать, даже в более общих случаях, заключается в возможности , известной как «преобразование Фултона» .По сути, это предназначено для обхода недостатка конструктора копирования, вместо этого оборачивая его в другой объект.(Хотя в конкретном примере, который вы показали, он даже не нужен).
В любом случае, хотя это должно применяться автоматически, есть несколько случаев, когда это невозможно.К счастью, вы можете включить его, даже если он не работает автоматически, используя %feature
Все, что вам нужно сделать, это включить в файл .i где-то перед первым объявлением / определением типа безКопия ctor следующая:
%feature("valuewrapper") Foo;
И это все.