Question

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

Je crois que la raison est que les tableaux peuvent être initialisées uniquement avec la syntaxe =, qui est:

int arr[3] = {1,3,4};

Questions

  1. Comment puis-je faire ce que je veux faire (que est, initialize un tableau dans un constructeur (pas assigner des éléments dans le corps)). Est-il même possible?
  2. Est-ce que le C ++ 03 dire quoi que ce soit la norme spéciale sur l'initialisation des agrégats (y compris les tableaux) dans initializers ctor? Ou le invalidness du code ci-dessus est un corollaire de certaines autres règles?
  3. Do C ++ 0x initialiseur listes résoudre le problème?

P.S. S'il vous plaît ne pas mentionner vecteurs, boost :: tableaux, et leur supériorité par rapport à des tableaux, que je suis bien au courant.

Était-ce utile?

La solution

  
      
  1. Comment puis-je faire ce que je veux faire (qui est, initialiser un tableau dans un constructeur (ne pas attribuer des éléments dans le corps)). Est-il même possible?
  2.   

Oui. Il utilise une struct qui contient un tableau. Vous dites que vous savez déjà à ce sujet, mais je ne comprends pas la question. De cette façon, vous ne initialiser un tableau dans le constructeur, sans affectations dans le corps. C'est ce que boost::array fait.

  

Est-ce que le C ++ 03 dire quoi que ce soit la norme spéciale sur l'initialisation des agrégats (y compris les tableaux) dans initializers ctor? Ou le invalidness du code ci-dessus est un corollaire de certaines autres règles?

A mem-initialiseur utilisations initialisation directe. Et les règles de l'article 8 interdisent ce genre de chose. Je ne suis pas sûr de le cas suivant, mais certains compilateurs ne le permettent.

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

Voir CCAG PR pour plus de détails.

  

Do C ++ 0x initialiseur listes résoudre le problème?

Oui, ils le font. Toutefois, votre syntaxe est invalide, je pense. Vous devez utiliser des accolades directement au feu de l'initialisation liste

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

Autres conseils

C ++ 98 ne fournit pas une syntaxe directe pour autre chose que la réduction à zéro (ou pour les éléments non-POD, la valeur d'initialisation) de la matrice. Pour que vous C(): arr() {} il suffit d'écrire.

Je chose Roger Pate se trompe sur les limites présumées de C ++ 0x initialisation globale, mais je suis trop paresseux pour regarder vers le haut ou le vérifier, et il n'a pas d'importance, est-il? EDIT : Roger parlait "C ++ 03", je mal lu comme "C ++ 0x". Désolé, Roger. ☺

A C ++ 98 solution de contournement pour le code actuel est d'envelopper la matrice dans un struct et l'initialiser à partir d'une constante statique de ce type. Les données doit résider quelque part en tout cas. Il le brassard Off peut ressembler à ceci:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};

Solution:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};
  1. Non, malheureusement.
  2. Vous ne pouvez pas la façon dont vous voulez, car il est pas permis par la grammaire (plus bas). Vous ne pouvez utiliser cteur comme l'initialisation, et, comme vous le savez, ce n'est pas disponible pour initialiser chaque élément dans des tableaux.
  3. Je crois que oui, car ils généralisent l'initialisation à travers le conseil d'administration de plusieurs façons utiles. Mais je ne suis pas sûr sur les détails.

En C ++ 03, l'initialisation globale applique uniquement avec la syntaxe similaire à celle ci-dessous, qui doit être une déclaration distincte et ne rentre pas dans un initialiseur cteur.

T var = {...};

Qu'en est-

...
  C() : arr{ {1,2,3} }
{}
...

Compile amende g ++ 4.8

Vous voulez initialiser un tableau de ints dans votre constructeur? Pointer vers un tableau statique.

class C 
{
public:
    int *cArray;

};

C::C {
    static int c_init[]{1,2,3};
    cArray = c_init;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top