[C++-sig] problem chaning object state using a python class that inherits from c++ class

Alexis H. Rivera-Rios ahrivera at yahoo.com
Mon Aug 15 23:35:52 CEST 2005


Hi,

I have the following classes:

class Entity
{
public:
	/// type of trajectory pointer
	typedef boost::shared_ptr<StatATA::Trajectory>
TrajectoryPtr;
	/// constructor
	Entity() : trajectory(), state() {}
	/// destructor
	virtual ~Entity() {}
	/// sets the position
	void SetPosition(const gmtl::Point3d &pos)
	{ 
		state.position = pos; 
	}
	/// returns the position
	gmtl::Point3d GetPosition() const 
	{ 
		return state.position; 
	}
        //.... other methods here...

	/// delegates to the Trajectory object 
	/// the updating the state
	virtual void UpdateState(double ellapsedTime=1)
	{
         	if (trajectory.get())
		{
		Trajectory *t = trajectory.get();
		t->UpdateState(state,ellapsedTime);
	 	}
	}
private:
	EntityState state; ///< entity's physical state
	TrajectoryPtr trajectory; 
	/// copy constructor disabled
	Entity(const Entity& );
	/// assignment disabled
	Entity& operator=(const Entity &);
};

class Trajectory 
{	
	/// disabled copy constructor
	Trajectory(const Trajectory &);
	/// disabled assignment
	Trajectory& operator=(const Trajectory&);
public:
	/// constructor
	Trajectory() {}
	/// destructor
	virtual ~Trajectory(){}
	/// updates the state of the entity
	virtual void UpdateState(EntityState& state, double
ellapsedTime) const  = 0;
};

I exposed the class using pyste and in python I'm
derived a class from it.

class HackedT(Trajectory):	
   def UpdateState(self, entitystate, ellapsedTime):
 	entitystate.position = gmtl.Point3d(-1,-1,-1)
 		

The problem is that when I do this in python:
target = Entity()
target.SetPosition(gmtl.Point3d(10,10,0))
target.SetTrajectory(hackedT)
target.UpdateState(1)
result = target.GetPosition()
print result[0]
print result[1]
print result[2]

I expect the result to be (-1,-1,-1) but instead its
coming out to be the original value.

However, if I use trajectories defined in C++ the new
values come out correct.

Is this a bug in Boost Python or do I have to specify
some policy or something to make this work?

Any help will be greatly appreciated,
Alexis

Programming Tutorial:
In Python: To do this, do this
In Perl: To do this, do this or this or this or this...
In C: To do this, do this, but be careful
In C++: To do this, do this, but don't do this, be careful of this, watch out for this, and whatever you do, don't do this

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



More information about the Cplusplus-sig mailing list