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 les 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?
struct
etclass
est que l'un par défaut est privé et l'autre public.Réponses:
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 fondamentalement la seule chose que vous perdez. Mais c'est aussi souvent une grosse perte.
la source
Avec C ++ 11, vous pouvez faire
Et chaque fois que vous oubliez d'initialiser quelque chose, vous obtenez l'initialisation par défaut.
la source
Réponse rapide:
Cela dépend de ce que vous voulez réaliser.
Réponse longue, longue et ennuyeuse:
Vous frappez le clou.
Je n'aime généralement pas que "C ++" autorise "Struct (s)" permet de déclarer des méthodes. De préférence, j'utilise des "classes" explicites pour les méthodes requises et des "structures (s)" POD pour les seuls champs.
Pourtant, je conviens que certaines opérations simples de base, comme:
Sont nécessaires et, dans ces circonstances, des méthodes pour les structures ont du sens.
Suggestion
Une autre solution potentielle consiste à utiliser des structures POD, mais en les traitant toujours conceptuellement comme des classes et des objets.
Enveloppez ces déclarations dans un espace de noms et ajoutez des fonctions globales pour les actions les plus importantes.
La déclaration de code pourrait être similaire à ceci:
Le code qui applique la solution pourrait ressembler à ceci:
Cette approche alternative est meilleure lorsqu'une énorme allocation de mémoire de données est requise ou en interaction avec d'autres bibliothèques partagées de bas niveau.
Cette approche, avec quelques modifications, est appliquée dans le développement de jeux.
Supplémentaire
Personnellement, je considère une extension de syntaxe pour "C ++", ou même, un nouveau PL basé sur "C ++" qui résout ce problème:
À votre santé.
la source