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標準に従うすべてのコンパイラ/OSで私に与えますか?

4

3 に答える 3

5

いいえ。それが機能するには、(少なくとも) 標準レイアウト タイプが必要です。float&ではないので、Vec3どちらでもありません。(9/7、第一弾)。

于 2012-05-07T14:37:56.973 に答える
3

As said in other answers, this won't work, because of the float&. See Standard Layout Classes and Trivially Copyable Types for a long explanation about standard layout.

You could consider a slightly different approach:

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_;
        }
};

Thus,

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";

Will print 1 2 3 for all compilers

Edit

You might also want to see What are Aggregates and PODs (1st answer) and What are Aggregates and PODs (2nd answer) for more precise information.

于 2012-05-07T14:53:57.980 に答える
1

いいえ。あなたのクラスはPODではないので、何の保証もありません。

于 2012-05-07T14:24:11.867 に答える