Инициализировать массив с постоянным размером в списке инициализаторов
У меня есть ситуация, которая может быть суммирована в следующем:
class Test
{
Test();
int MySet[10];
};
Можно ли инициализировать MySet
в списке инициализаторов?
Как и этот список инициализаторов:
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}
Есть ли способ инициализировать массив элементов с постоянным размером в списке классов initalizer?
Ответы
Ответ 1
Хотя С++ 03 недоступен, С++ 11 содержит расширенные списки инициализаторов. Вы действительно можете это сделать, если используете компилятор, соответствующий стандарту С++ 11.
struct Test {
Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { };
int set[10];
};
Приведенный выше код компилируется с использованием g++ -std=c++0x -c test.cc
.
Как указано ниже мной полезным пользователем в комментариях, этот код не компилирует с помощью компилятора Microsoft VС++, cl. Возможно, кто-нибудь скажет мне, будет ли эквивалент с помощью std::array
?
#include <array>
struct Test {
Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { };
std::array<int, 10> set;
};
Это также отлично компилируется с помощью g++ -std=c++0x -c test.cc
.
Ответ 2
К сожалению, в С++ 03 вы не можете инициализировать массивы в списках инициализаторов. Вы можете в С++ 11, хотя если ваш компилятор новее:)
см.: Как инициализировать массив-член с параметром initializer_list?
Ответ 3
"Я понимаю, что Set - это просто указатель на статический массив из 10 целых чисел"
Нет, это неправильно: это массив, а не указатель.
Вы все еще можете инициализировать его в списке инициализаторов конструктора.
Для компилятора, который не поддерживает инициализацию фигурных скобок С++ 11 (Visual С++ версии 11 и ранее приходит на ум) вам придется перепрыгивать через несколько обручей, как показано ниже:
#include <iostream>
#include <vector>
using namespace std;
#define CPP11
#if defined( _MSC_VER )
# if (_MSC_VER <= 1700)
# undef CPP11
# endif
#endif
#ifdef CPP11
class Cpp11
{
private:
int set_[10];
public:
Cpp11()
: set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
{}
int foo() const { return set_[3]; }
};
#endif
class Cpp03
{
private:
struct IntArray10 { int values[10]; };
IntArray10 set_;
static IntArray10 const& oneToTen()
{
static IntArray10 const values =
{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
return values;
}
public:
Cpp03()
: set_( oneToTen() )
{}
int foo() const { return set_.values[3]; }
};
int main()
{}
Вместо использования необработанных массивов используйте std::vector
и С++ + 11 std::array
, оба из которых поддерживаются даже Visual С++ 11.