Your reply actually helped alot. I hadn't considered that the call_method might have been being used incorrectly. Turns out it was. After looking up the documentation for call_method, by changing
void StatusEffectWrapper::TickCharacter(Game::Character::BaseCharacter* character, Game::Battles::BattleField *field, int ticks) { call_method<void>(self, "TickCharacter", character, field, ticks); } to this void StatusEffectWrapper::TickCharacter(Game::Character::BaseCharacter* character, Game::Battles::BattleField *field, int ticks) { call_method<void>(self, "TickCharacter", ptr(character), ptr(field), ticks); } I get the behave I expected. Thanks! > Date: Wed, 25 May 2011 15:35:31 -0700 > From: tallji...@gmail.com > To: cplusplus-sig@python.org > Subject: Re: [C++-sig] boost::python - how to pass by reference/pointer to > python overriden class functions > > On 05/25/2011 02:26 PM, Jay Riley wrote: > > I have some class functions that takes in parameters by pointer. > > However, when I expose and override this class/these functions in > > boost::python, any changes I make to the parameters are not reflected > > back to the original, meaning it isn't being passed by pointer as I > > expect. I previously had them as pass-by-reference, but the same problem > > still occurred. For an example of what I mean, here's some of my code > > with unimportant functions and details omitted. > > > > I note two spots that bear further investigation. > > The most likely source is here: > > > //In the actual scripting code > > void StatusEffectWrapper::TickCharacter(Game::Character::BaseCharacter* > > character, Game::Battles::BattleField *field, int ticks) > > { > > call_method<void>(self, "TickCharacter", character, field, ticks); > > } > > I think there's a very good chance that call_method is copying your > character argument when it converts it to Python. Boost.Python is > extra-careful about making sure the C++ objects it puts inside Python > objects don't turn into dangling references, and it has no way to > control the lifetime of a raw pointer or reference. I think you could > probably fix this by using shared_ptr<BaseCharacter> here, because > Boost.Python does know how to convert that safely to Python without > copying the pointee. > > If that fails, look here: > > > .def("TickCharacter", &StatusEffect::TickCharacter, > > &StatusEffectWrapper::TickCharacterDefault) > > I've personally never seen this invocation of .def, with two member > function pointer arguments. That doesn't necessarily mean it's > incorrect, because overloading virtual methods in Python is feature I > almost never use, and it seems like there are a half-dozen ways to do it > and I never know which one is considered best (perhaps someone else on > this list does?). But you might want to make sure this does what you > expect. > > HTH > > Jim Bosch > _______________________________________________ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > http://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig