嘿,所以我正在制作一个序列化函数,它接受一个基类指针'Joint'
,提取它'type'
的联合后代,然后想要根据指针真正指向的任何类型的“联合”实例化正确类型的“定义” .
但是,即使我 static_cast 指向正确类型的指针,我仍然收到关于不包含后代类所具有的函数的基类关节的错误。我如何让编译器意识到指针也被转换为具有该功能的新类型?
我也收到关于“typedef”的错误,这可能会根据关节*的“类型”而有所不同,编译时说它是未定义的。我如何告诉编译器无论如何,其中一个 if 语句都是正确的?(Jointdef 在 if 语句中声明)
这是来源:
template<class Archive>
b2Joint* const preSave(Archive & ar, b2Joint* Joint)
{
int Type = Joint->GetType();
ar & Type; // pulled out first so we know what kind of JointDef to instantiate
if(Type == b2JointType::e_distanceJoint){
b2DistanceJointDef JointDef;
static_cast<b2DistanceJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.length= Joint->GetLength();
JointDef.frequencyHz= Joint->GetFrequency();
}
if(Type == b2JointType::e_weldJoint){
b2WeldJointDef JointDef;
static_cast<b2WeldJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.referenceAngle= Joint->GetReferenceAngle(); // function added
}
if(Type == b2JointType::e_gearJoint){ //TODO / NOTE: this must be loaded last since to be linked joints must first be made
b2GearJointDef JointDef; // unless joints are in order of when they were created.......
static_cast<b2GearJoint *>(Joint);
JointDef.joint1= Joint->GetJoint1; //function added
JointDef.joint2= Joint->GetJoint2; //function added
JointDef.ratio= Joint->GetRatio();
}
if(Type == b2JointType::e_lineJoint){
b2LineJointDef JointDef;
static_cast<b2LineJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.enableLimit; Joint->IsLimitEnabled();
JointDef.localAxisA= Joint->GetLocalAxisA() //function made
JointDef.lowerTranslation= Joint->GetLowerLimit();
JointDef.upperTranslation= Joint->GetUpperLimit();
JointDef.enableMotor= Joint->IsMotorEnabled();
JointDef.maxMotorForce= Joint->GetMaxMotorForce();
JointDef.motorSpeed= Joint->GetMotorSpeed();
}
if(Type == b2JointType::e_mouseJoint){
b2MouseJointDef JointDef;
static_cast<b2MouseJoint *>(Joint);
JointDef.target= Joint->GetTarget();
JointDef.maxForce= Joint->GetMaxForce();
JointDef.frequencyHz= Joint->GetFrequency();
JointDef.dampingRatio= Joint->GetDampingRatio();
}
if(Type == b2JointType::e_prismaticJoint){
b2PrismaticJointDef JointDef;
static_cast<b2PrismaticJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.enableLimit; Joint->IsLimitEnabled();
JointDef.referenceAngle= Joint->GetReferenceAngle(); //added function
JointDef.localAxis1= Joint->GetLocalAxis1(); //added function
JointDef.maxMotorForce= Joint->GetMaxMotorForce(); //added function
JointDef.lowerTranslation= Joint->GetLowerLimit();
JointDef.upperTranslation= Joint->GetUpperLimit();
JointDef.enableMotor= Joint->IsMotorEnabled();
JointDef.motorSpeed= Joint->GetMotorSpeed();
}
if(Type == b2JointType::e_pulleyJoint){
b2PulleyJointDef JointDef;
static_cast<b2PulleyJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.groundAnchorA= Joint->GetGroundAnchorA();
JointDef.groundAnchorB= Joint->GetGroundAnchorB();
JointDef.lengthA= Joint->GetLength1();
JointDef.lengthB= Joint->GetLength2();
JointDef.maxLengthA= Joint->GetMaxPulleyLengthA(); //added function
JointDef.maxLengthB= Joint->GetMaxPulleyLengthB(); //added function
JointDef.ratio= Joint->GetRatio();
}
if(Type == b2JointType::e_revoluteJoint){
b2RevoluteJointDef JointDef;
static_cast<b2RevoluteJoint *>(Joint);
JointDef.localAnchorA= Joint->GetAnchorA();
JointDef.localAnchorB= Joint->GetAnchorB();
JointDef.enableLimit; Joint->IsLimitEnabled();
JointDef.enableMotor= Joint->IsMotorEnabled();
JointDef.motorSpeed= Joint->GetMotorSpeed();
JointDef.maxMotorTorque= Joint->GetMaxMotorTorque() //added function
JointDef.referenceAngle Joint->GetReferenceAngle() //added function
JointDef.lowerAngle= Joint->GetLowerLimit();
JointDef.upperAngle= Joint->GetUpperLimit();
}
else{ b2JointDef
//if(Type == b2JointType::e_frictionJoint){ QUESTION: what is this... not in box2d guide...
// base class JointDef data:
JointDef.type= Joint->GetType();
JointDef.userData= Joint->GetUserData();
JointDef.bodyA= Joint->GetBodyA();
JointDef.bodyB= Joint->GetBodyB();
JointDef.collideConnected= Joint->IsCollideConnected(); //added function
ar & JointDef;
return Joint;
}