我正在尝试为这个类编写静态初始值设定项:
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 }
};
有没有人知道如何或者是否可以静态初始化它?
答案 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;
}();
注意结尾的()
,表示我们正在调用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();
答案 2 :(得分:0)
如果我为你的类添加一个以CornerData和EdgeData作为参数的构造函数,代码对我有用。
Cube3x3(CornerData cornerData, EdgeData edgeData)
: mCorners(cornerData),
mEdges(edgeData)
{
}
以下是链接:http://ideone.com/XzBXZM