gpt4 book ai didi

c++ - 根据情况在 if 语句中声明不同的数据类型 : how to shut up the compiler?

转载 作者:太空宇宙 更新时间:2023-11-04 16:31:02 25 4
gpt4 key购买 nike

嘿,所以我正在制作一个序列化函数,它采用基类指针 'Joint',提取 union 后代的 'type',然后 < strong>想要实例化正确类型的“定义”,基于指针实际指向的任何类型的“关节”。

  • 但是我仍然收到关于基类关节的错误包含后代类确实具有的功能,即使我static_cast 指向正确类型的指针。 我如何制作编译器意识到指针也被转换为一种新类型有功能吗?

  • 我也收到关于“typedef”的错误,这可能是不同的基于 union *是什么“类型”,编译说它是不明确的。 我如何告诉编译器无论如何,其中一个 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;
}

最佳答案

您对 static_cast 的使用是问题所在。 static_cast 不会重新定义变量的类型:相反,它会返回转换为您要求的类型的值。

Type* variable = static_cast<Type*>(variableToCast);

此外,如果您的类使用多态性,请考虑使用 dynamic_cast,它利用了 C++ 的(不是很强大的)运行时类型信息系统。

if (b2DistanceJointDef* def = dynamic_cast<b2JointTypeDef*>(Joint))
{
// if you reach this block, this means Joint is actually a pointer to
// a b2JointTypeDef object; and you may use the `def` variable to access
// its members
}

更好的是,如果您喜欢这种事情,并且在您的设计中有意义,您可以考虑使用多态方法来消除这种类型转换。关于为什么它在这个站点和几乎所有地方都更好以避免显式类型转换的广泛讨论。


对于typedef 语句,您必须区分编译时信息和运行时信息。 C++ 是一种静态类型语言:这意味着它需要在编译阶段了解有关变量类型的所有信息。类型定义不能因运行时条件而异:它需要在编译阶段解决。

此外,符号(基本上,任何具有标识符的东西都是符号)不能在其范围之外使用。因此,如果您在 if block 下声明任何内容,您将无法从该 if block 之外访问它。

由于 typedef 在作用域内使用 typedef 生成符号,因此定义的类型在作用域结束之前都可用,不再继续。例如:

if (foo)
{
typedef int myInt;
myInt var = 4; // works
}
myInt baz = 4; // fails

关于c++ - 根据情况在 if 语句中声明不同的数据类型 : how to shut up the compiler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6964979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com