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
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig