pasaranaxне найден метод преобразования… - это потому, что boost.python теряется в случае непонятного указателя с неявной политикой владения.
А в чем ошибка в моем варианте оборачивания тех двух методов? Я проверил вот по такому коду в питоне, висячей ссылки не получается:а если убрать call policy, то вылезает ошибка компиляции, и при задании property тоже ошибка компиляции “не найден метод преобразования…”import World
npc = World.NPC()
npc.Id = 10
item = World.Item()
item.setOwner(npc)
del npc
print item.getOwner().Id
Я ваш код не компилил, не могу сказать больше. Если интересно - посмотрю более подробно.
Ваш “тестовый пример” не вполне корректен - потому и живет.
Кстати, речь идет не о “кольце”, оно же “висячая ссылка” - а о повреждении памяти.
class MegaBrain {
NPC* npc;
NPC* make_npc(){
npc = new NPC();
return npc;
}
void kill_npc(){
delete npc;
}
}
import World
npc = World.MegaBrain.make_npc()
npc.Id = 10
item = World.Item()
item.setOwner(npc)
World.MegaBrain.kill_npc()
print item.getOwner().Id # попались. Объекта npc уже нет, а питон на него все еще ссылается.
#Результат - core dump. Если повезло - сразу. Обычно - гораздо позже, когда понять причину уже невозможно.
Тогда приходим к моему облегченному варианту номер 2.
Есть четкие договоренности между программистами и никто кроме питона не “владеет” объектами, выставленными питону на управление.