web-dev-qa-db-fra.com

Faut-il ajouter des constructeurs aux structures?

Nous utilisons souvent des structures c ++ pour définir la structure des données par opposition à la classe qui peut être un module complet avec des méthodes membres. Maintenant, au fond, nous savons que les deux sont les mêmes (en gros).

Le fait que nous utilisons/traitons souvent des structures en tant qu'entités de données uniquement crée cette envie de ne pas ajouter également de constructeurs par défaut. Mais les constructeurs sont toujours super, ils simplifient les choses et aident à éliminer les erreurs.

Serait-il mal vu si j'ajoutais des constructeurs par défaut à mes structures de données?

L'implémentation du constructeur par défaut rend-elle également la structure Non-POD (type de données ancien simple) à condition que d'autres critères soient remplis?

Pour mettre les choses en perspective, considérons un exemple simple mais en réalité la structure serait beaucoup plus grande.

struct method
{
    char    name[32];
    float   temperature;
    int     duration;
};

Chaque fois que je crée une méthode, je dois m'inquiéter (pour dire le moins) si j'oublie de définir une valeur. Imaginez que j'oublie de définir temperature et d'appliquer la méthode au système qui est maintenant une valeur élevée aléatoire et provoque le chaos. Ou j'ai oublié de définir duration et maintenant la méthode s'applique elle-même pour une durée élevée inconnue.

Pourquoi devrais-je prendre la responsabilité d'initialiser l'objet à chaque fois au lieu d'implémenter son constructeur qui le garantit?

14
zadane

Parfois, il est approprié d'ajouter un constructeur à une structure et parfois ce n'est pas le cas.

L'ajout d'un constructeur (n'importe quel constructeur) à une structure empêche d'utiliser un initialiseur d'agrégat dessus. Donc, si vous ajoutez un constructeur par défaut, vous devrez également définir un constructeur non par défaut initialisant les valeurs. Mais si vous voulez vous assurer que vous initialisez toujours tous les membres, c'est approprié.

L'ajout de constructeur (n'importe quel constructeur, encore une fois) le rend non POD, mais en C++ 11 la plupart des règles qui s'appliquaient auparavant au POD uniquement ont été modifiées pour s'appliquer aux objets de disposition standard et l'ajout de constructeurs ne rompt pas cela. Donc, l'initialiseur d'agrégat est essentiellement la seule chose que vous perdez. Mais c'est aussi souvent une grosse perte.

13
Jan Hudec

Avec C++ 11 vous pouvez le faire

struct method
{
    char    name[32] {};
    float   temperature = 42.141521;
    int     duration = -6;
};

Et chaque fois que vous oubliez d'initialiser quelque chose, vous obtenez l'initialisation par défaut.

8
Vorac