首页 > 解决方案 > 具有与父级不同的变量名的 C++ 子结构

问题描述

我做了一个这样的 3d 矢量类

struct Vector3D {
    float x;
    float y;
    float z;

    Vector3D() {
        x = 0;
        y = 0;
        z = 0;
    }

    Vector3D(float x1,float y1,float z1=0) {
        x = x1;
        y = y1;
        z = z1;
    }

    //member functions for operator overloading, dot product, etc.
};

但现在我想创建一个特定于欧拉角的子类。到目前为止我有

struct Euler3D : Vector3D {
      float roll;
      float pitch;
      float yaw;
};

如何制作课程以便滚动俯仰和偏航参考与 x、y 和 z 相同的数据?我认为这涉及到union什么。我希望能够实现这样的目标:

Euler3D a = {1, 2, 3};
cout << a.x << endl; // prints 1
a.x = 1.5;
cout << a.roll << endl; //prints 1.5

谢谢

标签: c++inheritancestruct

解决方案


如何制作课程以便滚动俯仰和偏航参考与 x、y 和 z 相同的数据?

你不能。

由于您想引用一个对象,您可以使用引用来代替,但这会破坏复制 - 您可以通过使用用户定义的复制构造函数来修复。此外(就像您的重复一样)这会引入不必要的内存开销。


您可以做的是编写一个返回对成员的引用的函数。像这样:

struct Euler3D : Vector3D {
      float& roll() { return x; }

但这也不理想,因为您可能至少需要第二组 const 重载,因此需要大量样板。

我认为这涉及到工会什么的。

您可以使用联合来拥有别名成员,但您不能拥有继承。这是允许的:

struct Euler3D {
    union { float x, roll;  };
    union { float y, pitch; };
    union { float z, yaw;   };
};

您可以完全按照代码段中的方式使用它。


推荐阅读