If you wish to clone an object derived from ReferenceTarget
you must use RemapDir::CloneRef()
or ::CloneRefHierarchy()
instead of ReferenceTarget::Clone()
. This will correctly perform backpatching of references in the reference hierarchy. If backpatching is not performed, a reference graph can keep references to the original object, instead of to the copied object.
ReferenceTarget* Clone(ReferenceTarget* aTarget)
{
return CloneRefHierarchy(aTarget);
}
};
In some cases you may need to clone a group of references, in which case you would need to use an instance of RemapDir
. The following code demonstrates such a scenario:
PRSControl& PRSControl::operator=(const PRSControl& ctrl) {
RemapDir *remap = NewRemapDir();
ReplaceReference(PRS_POS_REF,remap->CloneRef(ctrl.pos));
ReplaceReference(PRS_ROT_REF,remap->CloneRef(ctrl.rot));
ReplaceReference(PRS_SCL_REF,remap->CloneRef(ctrl.scl));
// Make sure that if any sub-controller references this
// controller that it will get backpatched correctly
remap->AddEntry(ctrl,this);
remap->DeleteThis();
mLocked = ctrl.mLocked;
return(*this);
}