Предположим, у меня есть два модуля boost python, которые определены следующим образом. Модуль A:Зависимости кросс-модулей в Boost Python
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
И модуль В:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Модуль B имеет зависимость от модуля А (т.е. он использует SomeClass
из модуля А). Теперь я выполнить следующий скрипт: питон
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
Я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "C:\bladiebla\script.py", line 8, in <module>
obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)
Кажется, что Python автоматически не классы между модулями. Кто-нибудь есть идея, как это решить?
Привет, большое спасибо за отзыв. Однако я хотел бы решить эту проблему для двух классов, которые не имеют отношения наследования. Например, вы можете себе представить, что «SomeClass» на самом деле представляет собой «Треугольник» класса, а «AnotherClass» - это класс «Polygon». Я определенно не хочу, чтобы Polygon наследовал от Triangle, потому что это не имеет смысла с точки зрения OO. Итак, как я могу иметь два класса в разных модулях, которые не наследуют друг от друга, но которые используют друг друга через Python, как в моем первоначальном примере? – Arjan
'func()' хочет аргумент 'SomeClass'. Если вы хотите передать ему что-то другое, например 'AnotherClass', вы можете сделать это ** без ** создания' AnotherClass' наследования из 'SomeClass', добавив конструктор в' SomeClass', который принимает в качестве аргумента 'AnotherClass'. В качестве альтернативы вы можете просто написать что-то, что приняло аргумент «AnotherClass» и вернул экземпляр «SomeClass», но ему нужно было бы его явно называть.Если вы не можете сделать что-то подобное, я думаю, что вы застряли - что 'func()' должен делать в любом случае, если передан какой-то произвольный класс, о котором он ничего не знает? – martineau
Да, я это понимаю, но я не хочу передавать ничего подобного этой функции, только аргумент типа SomeClass. В примере сценария python мой объект obj1 имеет тип A.SomeClass. Он не связан с B.AnotherClass. «func» в B.AnotherClass должен принимать параметры типа A.SomeClass, такие как obj1. – Arjan