Comment initialiser une carte qui prend une structure comme valeur?
Je suis en utilisant une carte sous la forme d'un tableau associatif de Id -> valeur, où la valeur est un struct la définition de l'objet:
#include <map>
struct category {
int id;
std::string name;
};
std::map<int, category> categories;
int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}
Le code ci-dessus compile avec g++, mais avec l'avertissement suivant:
warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
J'ai lu divers questions/réponses ici sur la structure de l'initialisation, mais je suis encore un peu confus. J'ai une série de questions connexes:
- Je pourrais ajouter le compilateur option -std=c++0x et être fait avec l'avertissement, mais toujours pas plus avancé sur le problème sous-jacent. Ne serait pas les choses de se briser si j'ai ajouter une méthode à la catégorie struct?
- Quelle serait la meilleure façon d'initialiser ce POD struct (catégorie) en plus C++03 conforme?
- Fondamentalement, je ne suis pas encore sûr des conséquences de faire les choses d'une façon plutôt que d'une autre façon. Ce genre de tableau associatif (où la clé est l'ID d'un objet) est facile avec PHP, et je suis encore à apprendre sur la bonne façon de le faire en C++. A quoi dois-je prêter attention dans le contexte du code ci-dessus?
Modifier
Les questions suivantes sont liés, mais je n'ai pas compris les réponses quand j'ai lu:
C++ initialiser anonyme struct
c++ de l'Initialisation d'une structure avec un tableau en tant que membre
L'initialisation des structures en C++
source d'informationauteur augustin
Vous devez vous connecter pour publier un commentaire.
En C++ (ISO/IEC 14882:2003), un corset ci-joint la liste des expressions peuvent être utilisées pour initialiser une variable de globale type dans la déclaration, qui la définit.
E. g.
Un globale type est un tableau ou une classe sans que l'utilisateur n'-a déclaré constructeurs, sans privés ou protégés non-membres de données statiques, pas de classes de base, et pas de fonctions virtuelles. Notez qu'une classe globale n'a pas à être une GOUSSE de classe et tout tableau est un globale de savoir si ou non le type qu'il est un tableau de est un agrégat.
Cependant, un corset-joint une liste des expressions n'est valable que un initialiseur, pour un montant total, il n'est généralement pas autorisés dans d'autres contextes tels que la cession ou un constructeur de la classe de la liste d'initialisation de membre.
Dans le projet actuel de la prochaine version de C++ (C++0x), un corset ci-joint la liste des expressions (corset-init-liste) est autorisé dans plus de contextes et lorsqu'un objet est initialisé à partir d'une telle liste d'initialiseur il est appelé liste d'initialisation d'.
De nouveaux contextes où une telle liste peut inclure des arguments dans un appel de fonction, la fonction renvoie la, arguments pour les constructeurs, les membres et la base des initialiseurs et sur le côté droit d'une affectation.
Cela signifie que ce n'est pas valide en C++03.
Au lieu de cela, vous pourriez faire quelque chose comme cela.
Alternativement.
Ou, vous pourriez envisager de faire un factory fonction de votre type. (Vous pouvez ajouter un constructeur pour votre type, mais ce serait faire de votre classe un non agrégées et ne vous empêche d'utiliser d'agrégation d'initialisation dans d'autres endroits.)
Dans le courant de la norme C++, vous pouvez utiliser l'initialiseur de listes pour initialiser les tableaux et les structures contenant de la GOUSSE de valeurs uniquement. Le prochain standard (aka C++0x ou C++1x) permettra de faire la même chose sur les structures contenant des non-POD types, par exemple std::string. C'est ce que l'avertissement est d'environ.
Je vous suggère d'ajouter un simple constructeur de
category
qui prend l'id et le nom et d'appeler tout simplement que le constructeur au lieu:le type d'initialisation que nous utilisons est introduite uniquement dans la nouvelle norme C++ C++0x, d'où l'avertissement et l'option du compilateur. Certains compilateurs gcc, g++, déjà en charge certaines des nouvelles fonctionnalités, mais la norme elle-même n'est pas encore accepté. Il ajoute de nombreuses nouvelles fonctionnalités de C++ que nous connaissons. Vous pouvez en lire plus sur Stroustrup du site.
pour initialiser la structure, vous pouvez ajouter un ctor (naturellement), par exemple
et puis pour initialiser la carte comme suit:
noter qu'une conversion implicite de
const char*
à la chaîne de travail ici, ou ailleurs, vous pouvez définir un ctor avecconst char*
aussi.la fonctionnalité dont vous avez besoin est appelé globale en C/C++. Par la recherche de la "somme c++",vous trouverez beaucoup d'informations détaillant les tenants et aboutissants.
Pas nécessaire à moins que la méthode influences sous-jacentes C++ disposition de la mémoire. Par exemple, une plaine de fonction n'a pas d'importance, mais une fonction virtuelle sera le cas, car il est probable établis devant les membres de la classe.
à l'aide de constructeurs comme les autres intervenants suggèrent.
Il peut impliquer des copies redondantes selon la façon dont vous concevez vous constructeur. mais il importe seulement si vous souvent vous avez besoin de l'initialisation et vous vous souciez vraiment de la performance.