Подтвердить что ты не робот

Инициализировать массив с постоянным размером в списке инициализаторов

У меня есть ситуация, которая может быть суммирована в следующем:

class Test
{

    Test();

    int MySet[10];

};

Можно ли инициализировать MySet в списке инициализаторов?

Как и этот список инициализаторов:

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}

Есть ли способ инициализировать массив элементов с постоянным размером в списке классов initalizer?

4b9b3361

Ответ 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.

Ответ 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.