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

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

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 ответа

Решение

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

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

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

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

Одним из решений является использование лямбда-кода 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();

Живой пример

Другие вопросы по тегам