静态初始化数组联合的结构

时间:2014-06-16 05:31:01

标签: c++ unions static-initialization static-initializer

我正在尝试为这个类编写静态初始值设定项:

class Cube3x3
{
    union CornerData
    {
        u8  mData8[8];
        u32 mData16[4];
        u32 mData32[2];
        u64 mData64;
    };

    union EdgeData
    {
        u8  mData8[12];
        u32 mData32[3];
    };

    CornerData mCorners;
    EdgeData mEdges;

    static const Cube3x3 sSolved;
};

我已经尝试了这个,以及很多变体,似乎我尝试的任何东西都不会起作用。

const Cube3x3 Cube3x3::sSolved =
{
    { 0, 0, 1, 0, 0, 0, 1, 0 },
    { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }
};

有没有人知道如何或者是否可以静态初始化它?

3 个答案:

答案 0 :(得分:1)

如果您愿意将Cube3x3从类更改为结构,则可以使用:

const Cube3x3 Cube3x3::sSolved = {0};

<强>更新

使用结构时,您也可以使用非零值初始化成员,就像在更新的问题中一样。

const Cube3x3 Cube3x3::sSolved =
{
    { 0, 0, 1, 0, 0, 0, 1, 0 },
    { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }
};

答案 1 :(得分:0)

一种解决方案是使用C ++ 11 lambdas来初始化它。

const Cube3x3 Cube3x3::sSolved = []{
    Cube3x3 cube;
    std::fill(std::begin(cube.mCorners.mData8), std::end(cube.mCorners.mData8), 0);
    std::fill(std::begin(cube.mEdges.mData8), std::end(cube.mEdges.mData8), 0);

    return cube;
}();

Live Example

注意结尾的(),表示我们正在调用lambda函数。如果您使用的是非C ++ 11编译器,或者至少有一个尚不支持C ++ 11 lambda的编译器,您可以编写一个与编写lambda时基本相同的函数。然后,在静态初始化所需对象时,需要调用该函数。

Cube3x3 initialize() {
    Cube3x3 cube;
    std::fill(&cube.mCorners.mData8[0], &cube.mCorners.mData8[8], 0);
    std::fill(&cube.mEdges.mData8[0], &cube.mEdges.mData8[8], 0);

    return cube;
}


const Cube3x3 Cube3x3::sSolved = initialize();

Live Example

答案 2 :(得分:0)

如果我为你的类添加一个以CornerData和EdgeData作为参数的构造函数,代码对我有用。

Cube3x3(CornerData cornerData, EdgeData edgeData) 
                        : mCorners(cornerData), 
                          mEdges(edgeData)
{
}

以下是链接:http://ideone.com/XzBXZM