Статическая инициализация структуры объединений массивов

Я пытаюсь написать статические инициализаторы для этого класса:

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

Кто-нибудь знает, как, или, если возможно, статическая инициализация этого?

2

Решение

Если вы готовы изменить 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

Другие решения

Одним из решений является использование лямбда-кода C ++ 11 для его инициализации.

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

Живой пример

Обратите внимание () в конце, который указывает, что мы вызываем эту лямбда-функцию. Если вы используете компилятор не на C ++ 11 или, по крайней мере, тот, который еще не поддерживает лямбда-выражения C ++ 11, вы можете написать функцию с тем же самым телом, что и при написании лямбда-выражения. Затем вам нужно вызвать эту функцию при статической инициализации нужного объекта.

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

Живой пример

0

Код работает для меня, если я добавлю конструктор для вашего класса, который принимает CornerData и EdgeData в качестве аргументов.

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

Вот ссылка: http://ideone.com/XzBXZM

0
По вопросам рекламы [email protected]