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?
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
.
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?
"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.