Объявление нестатического константного массива как члена класса

Как мы можем объявить нестатический массив констант в качестве атрибута класса?

Следующий код вызывает ошибку компиляции

'Test :: x': член не может быть инициализирован

class Test
{
public:
    const int x[10];

public:
    Test()
    {
    }
};

person Vadakkumpadath    schedule 05.10.2009    source источник
comment
Мне нужно сохранить некоторые данные конфигурации, которые доступны во время компиляции. Я хочу, чтобы это было помещено в область хранения, доступную только для чтения.   -  person Vadakkumpadath    schedule 05.10.2009


Ответы (3)


Вам следует прочитать этот уже опубликованный вопрос. Поскольку сделать то, что вы хотите, невозможно, обходной путь - использовать std :: vector.

person Ashwin    schedule 05.10.2009
comment
Спасибо за ответ. Но это решение невозможно в случае массивов. Когда мы инициализируем массивы, мы получим еще одну ошибку компиляции (нельзя указать явный инициализатор для массивов). - person Vadakkumpadath; 05.10.2009
comment
Я отредактировал свой ответ. Я связал не тот вопрос. Пожалуйста, взгляните на это еще раз. - person Ashwin; 05.10.2009
comment
std::vector это не то же самое. Он выделяет память в куче. - person Kirill V. Lyadvinsky; 05.10.2009
comment
Я хочу, чтобы это было инициализировано в области хранения, доступной только для чтения. Возможно ли это с помощью std :: vector? - person Vadakkumpadath; 05.10.2009
comment
Вам не нужен динамически выделяемый объект, который выделяет память в области только для чтения. Это невозможно, память в области только для чтения должна быть инициализирована во время компиляции, но во время компиляции неизвестно, сколько объектов вы создадите. - person Gunther Piez; 05.10.2009
comment
На самом деле мне не нужно выделять динамически. Инициализируемые данные доступны во время компиляции. Объявление const Test T = {0} возможно, если для этого класса не определен конструктор. Мне нужна такая (или что-то вроде этого) инициализация с определенным конструктором. - person Vadakkumpadath; 05.10.2009
comment
Если вы не хотите, чтобы он динамически распределялся, и вы хотите, чтобы он указывал на что-то в ПЗУ, которое инициализируется во время компиляции, почему бы просто не иметь статический массив-констант? Вы сможете делать именно то, что хотите. - person Michael Burr; 06.10.2009
comment
@Michael - Спасибо, но мне нужно создать несколько (скажем, 5) экземпляров этого класса с разными конфигурациями (конфигурацию можно сохранить в x []). Поэтому я не могу использовать статический массив. - person Vadakkumpadath; 06.10.2009

Вы можете использовать класс array из tr1.

class Test
{
public:
 const array<int, 10> x;

public:
 Test(array<int,10> val) : x(val) // the only place to initialize x since it is const
 {
 }
};

array класс можно было бы упрощенно представить следующим образом:

template<typename T, int S>
class array
{
    T ar[S];
public:
    // constructors and operators
};
person Kirill V. Lyadvinsky    schedule 05.10.2009

Использование boost :: array (то же, что и tr1 ) это будет выглядеть так:

    #include<boost/array.hpp>

    class Test
    {   
       public:

        Test():constArray(staticConst) {}; 
        Test( boost::array<int,4> const& copyThisArray):constArray(copyThisArray) {}; 

        static const boost::array<int,4> staticConst; 

        const boost::array<int,4> constArray;
    };

    const boost::array<int,4> Test::staticConst = { { 1, 2, 3 ,5 } };

Дополнительный статический член кода необходим, потому что { { 1, 2, 3 ,5 } } недопустим в списке инициализации.

Некоторые преимущества заключаются в том, что в boost :: array определены итератор и стандартные методы контейнера, такие как size, begin и end.

person Arpegius    schedule 05.10.2009
comment
массив из tr1 имеет итератор и стандартные методы, такие как size / begin / end. Нет необходимости использовать ускорение только для одного простого класса. - person Kirill V. Lyadvinsky; 05.10.2009
comment
Вы правы. Но я использую boost везде до любой реализации tr1. - person Arpegius; 05.10.2009