I'm trying to implement a Cloning function for one of my classes I want to extend to Python. Extending the classes in C++ is easy as I can just override the Clone function, but it's definitely not working like that for Python. Here's the code, with unimportant detail ommitted.
template<class T> class Cloneable { public: typedef boost::shared_ptr<T> ClonePtr; virtual ClonePtr Clone() = 0; }; class Action : public Cloneable<Action> { public: virtual ClonePtr Clone() override; } Action::ClonePtr Action::Clone() { return ClonePtr(new Action(*this)); } class Attack : public Action { public: virtual ClonePtr Clone() override; } Attack::ClonePtr Attack::Clone() { return Attack::ClonePtr(new Attack(*this)); } struct AttackWrapper : Game::Battles::Actions::Attack { Cloneable<Action>::ClonePtr AttackWrapper::Clone() { return call_method<Cloneable<Action>::ClonePtr>(self, "Clone"); } Cloneable<Action>::ClonePtr AttackWrapper::CloneDefault() { return this->Action::Clone(); } } I expose it like follows: class_<Attack, boost::shared_ptr<Attack>, std::auto_ptr<AttackWrapper>, bases<Action> >("Attack") .def(init<>()) .def(init<Attack>()) .def("Clone", &Attack::Clone, &AttackWrapper::CloneDefault) ; In my python file: class ScriptedAttack(Attack): def __init__(self, Type, ID, Name, Flags, Power, MPCost = 0, SPCost = 0, Accuracy = 0.9, CritChance = 0.1, DefineOwnUse = False, EleWeights = None, StatusEffectChances = None): #initialization logic def Clone(self): #return ScriptedAttack(self) #what to put here? Fire = ScriptedAttack(ActionType.MagicAction, PrimaryEngine.GetUID(), "Fire", AttackFlags.Projectile | AttackFlags.Elemental, 32, 14, 0, 1.0, 0.1, False, {Elements.Fire: 1.0}) Fire2 = Fire.Clone() ActLibrary.AddAttack(Fire) ActLibrary.AddAttack(Fire2) I'm really not sure how to do this - I'm stuck on what I need to put under def Clone. I know I can't have multiple inits, and I can't define a copy constructor. I know about the copy function in python, but the Action class (base of Attack) has a custom copy constructor I need to be called. Can someone help me out with how to do this? Thanks in advance
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig