314 votes

Initialisation de la structure C ++

Est-il possible d'initialiser les structures en C++, comme indiqué ci-dessous

struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };
address temp_address =
               { .city = "Hamilton", .prov = "Ontario" };

Les liens ici et ici de mentionner qu'il est possible d'utiliser ce style que dans C. Si oui, pourquoi n'est-ce pas possible en C++? Est-il un sous-jacent pour des raisons techniques, il n'est pas implémentée en C++, ou est-ce une mauvaise pratique pour utiliser ce style. J'aime cette façon d'initialisation parce que ma structure est grand et ce style me donne une bonne lisibilité de ce que la valeur est affectée par les états.

Merci de partager avec moi si il y a d'autres moyens par lesquels nous pouvons réaliser la même lisibilité.

J'ai évoqué les liens suivants avant de poster cette question

  1. C/C++ pour AIX
  2. C de la Structure de l'Initialisation de la Variable
  3. Statique de la structure d'initialisation avec des balises en C++
  4. C++11 Bonne Structure D'Initialisation

189voto

Wyzard Points 16284

Si vous voulez préciser la valeur de chaque initialiseur, divisez-la en plusieurs lignes, avec un commentaire sur chacune d'elles:

 address temp_addres = {
  0,  // street_no
  nullptr,  // street_name
  "Hamilton",  // city
  "Ontario",  // prov
  nullptr,  // postal_code
};
 

112voto

Gui13 Points 3568

Après ma question a abouti à aucun résultat satisfaisant (parce que le C++ n'est pas mise en œuvre à base de balises init pour les structures), j'ai pris le truc que j'ai trouvé ici: Sont membres d'un C++ struct initialisé à 0 par défaut?

Pour vous, cela reviendrait à faire:

address temp_address = {}; // will zero all fields in C++
temp_address.city = "Hamilton";
temp_address.prov = "Ontario";

C'est certainement le plus proche de ce que vous vouliez à l'origine (zéro tous les champs à l'exception de ceux que vous souhaitez initialiser).

18voto

Gene Points 20184

Les identifiants de champ sont bien la syntaxe de l'initialiseur C. En C ++, donnez simplement les valeurs dans le bon ordre sans les noms de champs. Malheureusement, cela signifie que vous devez tous les donner (en fait, vous pouvez omettre les champs de valeur zéro et le résultat sera le même):

 address temp_address = { 0, 0, "Hamilton", "Ontario", 0 }; 
 

7voto

user396672 Points 1619

Vous pouvez même intégrer la solution de Gui13 à une seule instruction d'initialisation:

 struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };


address ta = (ta = address(), ta.city = "Hamilton", ta.prov = "Ontario", ta);
 

Disclaimer: Je ne recommande pas ce style

5voto

Puppy Points 90818

Ce n'est pas implémenté en C ++. (aussi, char* chaînes? J'espère que non).

Généralement, si vous avez autant de paramètres, c'est une odeur de code assez grave. Mais au lieu de cela, pourquoi ne pas simplement initialiser la structure par la valeur, puis affecter chaque membre?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X