web-dev-qa-db-fra.com

Initialiser un tableau de taille constante dans une liste d'initialisation

J'ai une situation qui peut être résumée comme suit:

class Test
{

    Test();

    int MySet[10];

};

est-il possible d'initialiser MySet dans une liste d'initialisation?

Comme ce genre de liste d'initialisation:

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

Existe-t-il un moyen d'initialiser un tableau de membres de taille constante dans la liste d'initalisation d'une classe?

23
Serge

Bien qu'il ne soit pas disponible dans C++ 03, C++ 11 introduit des listes d'initialisation étendues . Vous pouvez en effet le faire si vous utilisez un compilateur conforme à la norme C++ 11.

struct Test {
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { };
    int set[10];
};

Le code ci-dessus compile très bien en utilisant g++ -std=c++0x -c test.cc.


Comme indiqué ci-dessous par un utilisateur utile dans les commentaires, ce code ne compile pas en utilisant le compilateur VC++ de Microsoft, cl. Peut-être que quelqu'un peut me dire si l'équivalent en utilisant std::array volonté?

#include <array>

struct Test {
  Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { };
  std::array<int, 10> set;
};

Cela compile également très bien en utilisant g++ -std=c++0x -c test.cc.

26
oldrinb

Malheureusement, en C++ 03, vous ne pouvez pas initialiser les tableaux dans les listes d'initialisation. Vous pouvez en C++ 11 si votre compilateur est plus récent :)

voir: Comment initialiser un tableau de membres avec une liste initializer_list?

4

"Je comprends que Set n'est qu'un pointeur vers le tableau statique de 10 entiers"

Non, c'est faux: c'est un tableau, pas un pointeur.

Vous pouvez toujours l'initialiser dans la liste d'initialisation du constructeur.

Pour un compilateur qui ne prend pas en charge l'initialisation des accolades C++ 11 (Visual C++ version 11 et antérieures vient à l'esprit), vous devrez cependant passer par quelques cercles, comme indiqué ci-dessous:

#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()
{}

Au lieu d'utiliser des tableaux bruts, utilisez std::vector et C+++ 11 std::array, tous deux pris en charge même par Visual C++ 11.

3