3

考虑一下:

class Vec3
{
    private:
        float n[3];
    public:
        float& x;
        float& y;
        float& z;
        Vec3(float x_, float y_, float z_) : x(n[0]), y(n[1]), z(n[2])
        {
            x = x_;
            y = y_;
            z = z_;
        }
}

我可以确定这样做:

Vec3 v(1,2,3);
cout<<reinterpret_cast<float*>(&v)[0]<<"\t";
cout<<reinterpret_cast<float*>(&v)[1]<<"\t";
cout<<reinterpret_cast<float*>(&v)[2]<<"\t";

1 2 3每个遵循标准的编译器/操作系统都会给我吗?

4

3 回答 3

5

不,要让它工作,你需要(至少)一个标准布局类型。float&不是,因此Vec3也不是。(9/7,第一个子弹)。

于 2012-05-07T14:37:56.973 回答
3

正如在其他答案中所说,这是行不通的,因为float&. 有关标准布局的详细说明,请参阅标准布局类和可简单复制的类型

您可以考虑稍微不同的方法:

class Vec3
{
    private:
        float n[3];
    public:
        float& x() { return n[0]; }
        float& y() { return n[1]; }
        float& z() { return n[2]; }
        Vec3(float x_, float y_, float z_)
        {
            x() = x_;
            y() = y_;
            z() = z_;
        }
};

因此,

Vec3 v(1,2,3);
cout<<reinterpret_cast<float*>(&v)[0]<<"\t";
cout<<reinterpret_cast<float*>(&v)[1]<<"\t";
cout<<reinterpret_cast<float*>(&v)[2]<<"\t";

1 2 3将为所有编译器打印

编辑

您可能还想查看什么是聚合和 POD(第一个答案)什么是聚合和 POD(第二个答案)以获取更准确的信息。

于 2012-05-07T14:53:57.980 回答
1

没有。你的课不是 POD,所以没有任何保证,AFAIK。

于 2012-05-07T14:24:11.867 回答