IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Initialisation d'une map


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Par défaut Initialisation d'une map
    Bonsoir,

    Je galère un peu sur mon erreur de compil' (qui ne doit pas être grand chose m'enfin...)

    J'ai une classe qui contient un attribut map<int, int> qui est nommé du genre avec un typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <map>
     
    typedef std::map<unsigned int, unsigned int> Equinoxe;
     
     
    class Calendar {
    	protected:
    		static Equinoxe m_automne;
    		static void initAutomne(Equinoxe&);
    ........
     
    Calendar.h
    Vous l'avez peut être compris avec la méthode initAutomne(Equinoxe&), je souhaite initialiser ma map m_automne quand un Objet Calendar est construit en la passant par référence pour limiter l'allocation en mémoire, d'autant plus que le tableau est grand.

    Mais je butte sur cette erreur ou le compilo me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     error: no matching function for call to ‘Calendar::initAutomne(Equinoxe*)’
    note: candidate is: static void Calendar::initAutomne(Equinoxe&)
    Et je butte la dessus....

    Voila la déclaration dans mon fichier cc:

    Calendar.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Calendar::initAutomne(Equinoxe& m) { .... }
    qui est appelé dans mon constructeur par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initAutomne(&m_automne);
    Si vous avez des bonnes idées voire la solution (sans nul doute), je suis preneur !

    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour Pierre et bienvenu sur le forum (et bon choix de lecture )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initAutomne(&m_automne);
    Si tu utilises & ( = address_of), tu envoies un pointeur vers ta variable. Avec une référence, il suffit de passer directement la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initAutomne(m_automne);
    Une raison particulière que ce soit un static ? Et pourquoi le passer en paramètre de ta fonction si c'est un static ?

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    ça peut paraître étonnant, mais ton compilateur a raison ;

    initAutomne(&m_automne);
    ne fait pas un appel de initautomne avec un argment "référence sur Equinoxe", mais avec un argument "pointeur sur Equinoxe"

    Appelle dans ton constructeur comme ci-dessous, et ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initAutomne(m_automne);
    Cordialement

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Par défaut
    Merci pour vos remarques pertinentes

    Hélas on s'approche mais je tombe sur cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    undefined reference to `Calendar::m_automne'


    Bonne question gbdivers: Si ma manière de faire est bonne: je n'ai besoin que d'une instance de cette map et son remplissage demande près de 3000 lignes... ce qui ferait un peut désordre dans mon constructeur... Voilà pourquoi je préfère passer par une méthode à part. (la map est statique mais pas constante).

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Pierre de Siorac Voir le message
    Merci pour vos remarques pertinentes

    Hélas on s'approche mais je tombe sur cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    undefined reference to `Calendar::m_automne'


    Bonne question gbdivers: Si ma manière de faire est bonne: je n'ai besoin que d'une instance de cette map et son remplissage demande près de 3000 lignes... ce qui ferait un peut désordre dans mon constructeur... Voilà pourquoi je préfère passer par une méthode à part. (la map est statique mais pas constante).
    C'est normal: il faut que les variables statiques soit définies quelque part, hors de toutes fonction. Voir la FAQ sur le sujet

    Ceci dit, si tu as effectivement un membre statique de type équinoxe, il est:
    inutile de le passer à une fonction membre parce que les fonctions membres peuvent (c'est encore heureux ) accéder aux membre de la classes, même si les fonctions "de classe" (c'est le terme officiel pour les fonctions statiques ) ne peuvent accéder qu'aux membres "de classe" (ici aussi, c'est le terme officiel pour les membres statique).

    Il faut, peut etre, aussi comprendre l'intérêt des fonctions / membres statiques : ce sont des fonctions / membres auxquel(le)s on peut accéder sans être obligé de disposer d'une instance de la classe, et qui sont en outre partagé(e)s par toutes les instances...

    Est-il, dans le cas présent, bien utile de les utiliser, sachant qu'il y a, a priori, deux équinoxes par année, et que bien qu'elles tombent à date fixe, il sera difficile de faire tenir les deux dans un seul membre

    Si tu reste sur l'idée d'avoir les équinoxes comme membre statique, il faudrait, à pour le moins, disposer de deux membres statiques : un pour l'équinoxe d'été, l'autre pour l'équinoxe d'hiver.

    Enfin, Equinoxe et Solstice sont, AMHA des dates tout ce qu'il y a de plus normale, bien que nous puissions remarquer une particularité quant la quotité jour / nuit qu'elles représente...

    Je ne suis vraiment pas persuadé qu'il soit opportun de créer des classes particulières (sans doute dérivées d'une classe Date) pour représenter ces dates particulières, car il n'y a strictement rien dans leur comportement qui les distingue des autres (tout au plus distingue-t-on leur particularité, mais cela reste malgré tout... des dates tout à fait comme les autres )

    Et comme, en outre, Date est typiquement une classe qui a sémantique de valeur, elle n'a, a priori, pas vocation à être dérivée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Par défaut
    Bon sang mais c'est bien sûr ! J'avais oublié que les variables statiques doivent être definies en dehors J'essaierai ça demain. Merci de m'avoir rafraichi la mémoire avec les bonnes remarques !

    Ceci dit, pour faire simple à propos des équinoxes, je ne me sers que des équinoxes d'automnes (eh oui je fais dans l'originalité )qui ont lieu en général le 22 Septembre de chaque année mais peuvent aussi avoir lieu le 23 et même le 24 ! Et pour les connaître, je ne peux me baser que sur des données fournies par un observatoire puisque la variation est due aux contraintes physiques de la terre (et blabla j'en dis pas plus, ça sort de mon domaine. Faudrait faire une Faq astronomie . )

    Tout ça pour dire que ces valeurs ne peuvent pas être calculées et que je dois les insérer manuellement. Et cette classe calendar est la classe mère qui permet de fabriquer des calendriers...autres que grégorien, qui ont entre autres besoin de l'equinoxe d'automne pour fonctionner

    A Demain pour la suite

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Pierre de Siorac Voir le message
    Bon sang mais c'est bien sûr ! J'avais oublié que les variables statiques doivent être definies en dehors J'essaierai ça demain. Merci de m'avoir rafraichi la mémoire avec les bonnes remarques !

    Ceci dit, pour faire simple à propos des équinoxes, je ne me sers que des équinoxes d'automnes (eh oui je fais dans l'originalité )qui ont lieu en général le 22 Septembre de chaque année mais peuvent aussi avoir lieu le 23 et même le 24 ! Et pour les connaître, je ne peux me baser que sur des données fournies par un observatoire puisque la variation est due aux contraintes physiques de la terre (et blabla j'en dis pas plus, ça sort de mon domaine. Faudrait faire une Faq astronomie . )

    Tout ça pour dire que ces valeurs ne peuvent pas être calculées et que je dois les insérer manuellement. Et cette classe calendar est la classe mère qui permet de fabriquer des calendriers...autres que grégorien, qui ont entre autres besoin de l'equinoxe d'automne pour fonctionner

    A Demain pour la suite
    Cela va exactement dans le sens de tout ce que j'ai dit...

    Que tu maintienne, dans ton calendrier, une équinoxe, ou deux, ou n'importe quelle date plus ou moins variable est une chose, mais:
    1. Ce n'est jamais qu'une date, même si tu la "met en évidence" créant un membre qui la contienne : il n'est nul besoin de prévoir une classe particulière par rapport à une date "normale"
    2. Le simple fait que la date soit susceptible, tu l'as dit toi même, de varier d'une année à l'autre la disqualifie pour être une variable statique, car chaque calendrier doit avoir sa propre date.
    Pour expliquer plus précisément le (2), il faut te dire que toutes les instances d'une classe donnée vont partager les variables statiques.

    Si tu utilises, et c'est sans doute ce qu'il va se passer, dix calendriers différents (un pour chaque année comprise entre 2012 et 2022), en même temps, il y en aura sans doute quatre pour lesquels l'équinoxe tombera le 22, trois pour lesquels elle tombera le 23 et trois pour lesquels elle tombera le 24 (même si la distribution est un peu différente).

    Tu ne pourrais pas obtenir cette configuration avec une variable statique, vu que, une fois ta valeur définie, les dix calendriers utiliseraient la même date.

    Si tu venais à changer la date pour la faire correspondre à une année précise, elle serait fausse pour... toutes les années qui ne correspond pas.

    Ceci dit, je relis le code que tu donne, et je constate que, ce qui se passe surtout, c'est que tes termes sont très mal choisi...

    Ta classe Equinoxe qui est une map (année / date ) devrait, au minimum, être nommée de telle sorte à ce que l'on sache qu'il s'agit... d'une collection permettant de récupérer la date de l'équinoxe en fonction de l'année :EquinoxeMap semblerait bien meilleure

    De même, calendar pour moi représente une année, fusse-t-elle de la planète mars et puisse-t-elle durer 952 jours...

    A priori, pour une année donnée, il ne devrait donc y avoir qu'une date correspondant à l'équinoxe, et il n'est donc pas du ressort de Calendar de maintenir la liste de l'ensemble des dates d'équinoxe

    Si "quelque chose" doit garder cette liste à jour et doit permettre d'accéder à une date pour une année donnée, c'est tout, sauf le calendrier lui-même:

    La responsabilité de maintenir cette liste de dates (et de permettre de les retrouver) suffit amplement pour que tu en fasse une classe particulière, et l'on peut parfaitement imaginer que tu auras sans doute besoin de cette classe à certains endroit où... il n'y a pas lieu d'avoir de calendrier...

    Malgré tout le mal que l'on peut penser des variables globales (une variable statique n'est qu'une variable globale déguisée ) on peut sans doute se dire que l'idée d'utiliser un monostate (une recherche sur le forum t'indiquera de quoi il s'agit ) pour créer cette classe a quelques attraits
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. initialiser à vide une map static
    Par freestyler1982 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 25/09/2014, 10h38
  2. Réponses: 0
    Dernier message: 19/12/2011, 14h46
  3. [Data] Initialiser les clés d'une Map
    Par glognar dans le forum Spring
    Réponses: 0
    Dernier message: 19/10/2011, 16h25
  4. Initialisation d'itérateur sur une map vide
    Par Pitu45 dans le forum SL & STL
    Réponses: 2
    Dernier message: 18/09/2009, 11h32
  5. initialisation d'une map et d'un iterator
    Par petitmic dans le forum C++
    Réponses: 2
    Dernier message: 12/04/2006, 23h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo