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

Reply via email to