Supponiamo di avere due moduli boost python definiti come segue. Modulo A:Dipendenze del modulo incrociato in Boost Python
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
And modulo B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
modulo B ha una dipendenza modulo A (cioè usa SomeClass
dal modulo A). Ora, eseguo il seguente script python:
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
ottengo il seguente errore:
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)
Sembra che Python non si traduce automaticamente le classi tra i moduli. Qualcuno ha un'idea di come risolvere questo?
Ciao, grazie mille per il tuo feedback. Tuttavia, vorrei risolvere questo problema per due classi che non hanno una relazione di ereditarietà. Ad esempio, puoi immaginare che "SomeClass" sia in realtà un "Triangolo" di classe e che "AnotherClass" sia la classe "Poligono". Sicuramente non voglio che Polygon erediti da Triangle, perché non ha senso da un punto di vista OO. Quindi, come posso avere due classi in moduli diversi che non ereditano l'una dall'altra, ma che si usano a vicenda attraverso Python, come nel mio esempio originale? – Arjan
'func()' vuole un argomento 'SomeClass'. Se vuoi passare qualcosa di diverso, come 'AnotherClass', puoi farlo ** senza ** facendo' AnotherClass' ereditato da 'SomeClass' aggiungendo un costruttore a' SomeClass' che accetta un 'AnotherClass' come argomento. In alternativa, è possibile scrivere qualcosa che accetta un argomento 'AnotherClass' e restituisce un'istanza' SomeClass', ma dovrebbe chiamarla esplicitamente.Se non puoi fare una cosa del genere, allora penso che tu sia bloccato - cosa dovrebbe fare comunque 'func()', se passi qualche classe arbitraria di cui non sa nulla? – martineau
Sì, lo capisco, ma non voglio passare nulla di diverso a questa funzione, solo un argomento di tipo SomeClass. Nell'esempio dello script python, il mio obj1 è di tipo A.SomeClass. Non è correlato a B.AnotherClass. 'func' in B.AnotherClass dovrebbe accettare parametri di tipo A.SomeClass, come obj1. – Arjan