2

我有代码:

class Vector4
{

public:
    union
    {
        float x,y,z,w;
        float v[4];
    };

    Vector4(float _x, float _y, float _z, float _w)
    : x(_x), y(_y), z(_z), w(_w)
    {
        std::cout << "Vector4 constructor: " << this->x << "; " << this->y << "; " << this->z << "; " << this->w << std::endl;
    }
};

我记得在 VC 7.1 中一切都很好,但在 VC 2010 中我收到了警告:

警告 C4608:“Vector4::y”已由初始化列表中的另一个联合成员“Vector4::::Vector4::x”初始化

当我写:

Vector4 vec(1.0f, 0.0f, 0.0f, 0.0f);

我在控制台中看到:

Vector4构造函数:0;0; 0; 0

请告诉我,发生了什么?

4

1 回答 1

10

x,y,z,w将所有内容相互联合:所有四个浮点数共享相同的内存空间,因为联合的每个元素都从相同的内存地址开始。

相反,您希望将所有向量元素放在一个结构中,如下所示:

union {
    struct { float x, y, z, w; };
    float v[4];
};
于 2012-09-29T20:47:28.677 回答