2009-10-05 7 views
1

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

После кода выдает ошибку компиляции

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

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

public: 
    Test() 
    { 
    } 
}; 
+0

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

ответ

3

Вы должны прочитать this already posted question. Так как невозможно сделать то, что вы хотите, обходным путем является использование std :: vector.

+0

Thaks для ответа. Но это решение невозможно в случае массивов. Когда мы инициализируем массивы, мы получим еще одну ошибку компиляции («не может указывать явный инициализатор для массивов»). – Vadakkumpadath

+0

Я отредактировал свой ответ. Я связал неправильный вопрос. Пожалуйста, взгляните на него еще раз. – Ashwin

+0

'std :: vector' - это не то же самое. Он выделяет память в куче. –

1

Вы можете использовать класс 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 
}; 
0

Использование 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 определил итератор и стандартные методы контейнера, такие как размер, начало и конец.

+0

массив из tr1 имеет итератор и стандартные методы, такие как размер/начало/конец. Нет необходимости использовать boost только для одного простого класса. –

+0

Вы правы. Но я использую boost везде перед любой реализацией tr1. – Arpegius

Смежные вопросы