Как мы можем объявить нестатический массив констант в качестве атрибута класса?
Следующий код вызывает ошибку компиляции
'Test :: x': член не может быть инициализирован
class Test
{
public:
const int x[10];
public:
Test()
{
}
};
Как мы можем объявить нестатический массив констант в качестве атрибута класса?
Следующий код вызывает ошибку компиляции
'Test :: x': член не может быть инициализирован
class Test
{
public:
const int x[10];
public:
Test()
{
}
};
Вам следует прочитать этот уже опубликованный вопрос. Поскольку сделать то, что вы хотите, невозможно, обходной путь - использовать std :: vector.
std::vector
это не то же самое. Он выделяет память в куче.
- person Kirill V. Lyadvinsky; 05.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
};
Использование 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.