2

我正在尝试为此类编写静态初始化程序:

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

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

4

3 回答 3

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 }
};
于 2014-06-16T05:59:52.713 回答
0

一种解决方案是使用 C++11 lambda 对其进行初始化。

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;
}();

现场示例

请注意()末尾的 ,这表明我们正在调用该 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();

现场示例

于 2014-06-16T05:50:16.977 回答
0

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

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

这是链接:http: //ideone.com/XzBXZM

于 2014-06-16T07:04:30.480 回答