gpt4 book ai didi

c++ - 使用多态时在子对象之间转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:37 26 4
gpt4 key购买 nike

我遇到了一个可能与我的设计有关的问题,但我想要有关如何改进它的建议。本质上,我有一个父类,它有几个子类,我需要能够在子类之间进行转换。但是,在我当前的设计中要转换的对象使用多态和父类指针。我这样做是因为最终使用哪个子类是由用户输入决定的。我想出了三种方法来解决这个问题:

  1. 实现一个单独的“转换器”类,可以将每个子类转换为另一个子类。
  2. 声明将每个子类转换为其他子类的虚函数。 (这会产生循环依赖,我认为这不是一个好主意...)
  3. 在对象中包含一个枚举数据成员,说明它们是哪种类型,这样我就可以在转换时使用 switch() 语句。

还有其他我应该考虑的方法吗?这是一些我认为可以展示我想要做的事情的代码。

class Rotation
{
public:
void Set();
Vector Get();
virtual void Rotate(float amount);
virtual void SetFromQuaternion(Vector t_quaternion);
private:
Vector m_rotation;
}

class EulerAngles : Rotation
{
public:
void Rotate(float t_amount);
void SetFromQuaternion(Vector t_quaternion);
}

class Quaternion: Rotation
{
public:
void Rotate(float t_amount);
void SetFromQuaternion(Vector t_quaternion);//Just copies data
}
class RigidBody
{
public:
RigidBody(Rotation *t_rotation);
Rotation GetRotation();
void SetRotationFromQuaternion(Vector t_rotation) {m_rotation->SetRotationFromQuaternion(t_rotation);}
private:
std::unique_ptr<Rotation> *m_rotation;
}
int main()
{
//Argument is based on user input file, but euler angles are used as an example
Rigidbody body_1 = RigidBody(new EulerAngles());
// I want to rotate using quaternions to avoid singularities, but then convert back to euler angles. So here's where I would convert. How should I do this?
Quaternion temp_quaternion = (Quaternion)body_1.GetRotation();
temp_quaternion.Rotate(amount);
body_1.SetRotationFromQuaternion(temp_quaternion.Get());

return;
}

请注意,我的实际代码更复杂。我的问题更多地与总体设计“最佳实践”有关。提前致谢!

最佳答案

如果您使用多态性,您唯一能做的就是使用 dynamic_cast 恢复原始类型。示例:

Rotation * r = new Quaternion;
Quaternion * q = dynamic_cast<Quaternion*>(r);

现在,如果您想将一个子类转换为另一个子类,我想您已经知道 dynamic_cast 会失败,因为内部类型不是 EulerAngles 而是 四元数.

要做到这一点,据我所知,你别无选择,你必须自己转换。换句话说,编写一个转换器函数。

添加一个数据成员来给你对象的类型的想法很好,但是还不够。在任何情况下,如果您有一个 Rotation* 实际上是一个 Quaternion*,您仍然需要一个转换器来获得 EulerAngles*从它。

根据你的想法,你可以这样写:

// Here, I assumed that you will make the Rotation class pure virtual (I know that you didn't, but I think you should, and this only is an example)
enum class ROTATION_T {QUATERNION, EULERANGLES};

Rotation * convert(const Rotation * r)
{
// We assume here than the class Rotation has the attribute rotation_type saying the type.
if(r->rotation_type == ROTATION_T::QUATERNION)
{
// convert the Quaternion and return a EulerAngles*
}
else
{
// convert the EulerAngles and return a Quaternion*
}
}

我永远不会假装这是唯一的解决方案,但这是一种实现方式。

我希望它可以/将对您有所帮助。

关于c++ - 使用多态时在子对象之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56434778/

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