Лучший способ инициализировать член статического массива класса в C ++ (хотя предпочтительнее использовать const) - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть статический массив указателей на функции в качестве члена класса.

Мне нужно инициализировать его, но оказывается, что этот массив имеет длину 64 КБ, поэтому нецелесообразно инициализировать его статическим инициализатором, таким как { x, y, z, ... }, так как это может загромождать код.

Вместо этого я должен инициализировать его с помощью кода с несколькими циклами.

Я решил сделать это путем инициализации массива static в конструкторе и установки для него флага, так что только конструкция первого экземпляра класса будет запускать эту инициализацию.

Также доступ к этому статическому флагу из экземпляров не будет безопасным для потоков, но это уже другая история.

Есть ли более чистый или лучший способ сделать это?

Я также хотел бы, чтобы этот массив был const, но я боюсь, что единственный способ сделать это с инициализацией static {}, верно?

Ответы [ 2 ]

6 голосов
/ 13 ноября 2011

Другой вариант - использовать генерацию кода: напишите отдельную программу, которая генерирует исходный код для определения статического массива.

1 голос
/ 13 ноября 2011

Возможно, не код cleaniest, но как насчет того, чтобы сделать массив элементов статической ссылкой;

заголовочный файл:

class MyClass
{
    ...
    static const std::vector<pointer to member>& pointer_vector;
};

файл реализации:

namespace
{
    typedef std::vector<pointer to member> t_pointer_vector;

    t_pointer_vector pointer_vector;

    const t_pointer_vector& initialize_pointer_vector(void)
    {
        //generate pointer_vector

        return pointer_vector;
    }
}

t_pointer_vecotor& MyClass::pointer_vector = initialize_pointer_vector();

Если вы не хотите std::vector, вы можете взглянуть на std::tr1::array, массив с фиксированным размером, который безопаснее и не менее эффективен, чем массив в стиле C (согласно Boostдок).Это часть TR1.Базовую информацию о TR1 можно найти в википедии , ее документации в разделе Boost.

...