CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] const static initialisation

vive_cod4
vive_cod4
Niveau 9
31 juillet 2013 à 21:32:05

Bonjour,

je convertis actuellement un projet réalisé en java en C++. Je me retrouve confronté à un problème assez embêtant, celui-ci concerne seulement 2 classes :

http://pastebin.com/msiLGznV et http://pastebin.com/66YjbDpa.

Le problème, c'est même se produit avant le main. Quand je lis le fichier txt et je vais créer une nouvelle insertion dans la map, j'utilise une classe pour insérer la valeur. Dans cette classe, il y a un une autre map static constante, qui logiquement devrait être déjà initialisée lorsque j'appelle le constructeur, puisqu'il s'agit d'un const static. Or le problème, c'est qu'il n'exécute pas le bout de code et bien sûr, cela plante car chercher une valeur dans une map vide ...

Bref, j'ai entendu parler du static initialization order fiasco mais à l'execption que j'ai des statics consts. Mais j'ai remarqué que c'est pas tout à fait ça car je fais pas des appels croisé, dans le sens où c'est seulement le constructeur de la deuxième classe qui appelle mon const static map.

Une solution très moche que j'ai trouvé et de virer le const static pour un attribut privé, mais cette solution me dérange car il y a énomément de doublon (actuellement 7462 fois la même map construite et stocké en mémoire).

Qqun aurait-il une solution plus adéquate ?

En passant, vous verrez en commentaire que si je mets une variable pour le path du fichier, cela ne marche pas alors qu'en dure oui, si vous avez aussi une solution, ça serait sympa !

Merci d'avance

vive_cod4
vive_cod4
Niveau 9
31 juillet 2013 à 21:33:19

fail pour le deuxième lien : http://pastebin.com/66YjbDpa

chris_27
chris_27
Niveau 10
31 juillet 2013 à 23:55:30

Bonsoir,

Je te suggère déjà de virer tous les "static". Après, on pourra réfléchir aux endroits où ça peut servir d'en remettre.

Après, je t'avoue qu'en C++, je n'utilise quasiment jamais de static... vu qu'on peut définir des constantes et des types enums en dehors des classes, autant faire ça plutôt que d'encombrer la définition de la classe.

Typiquement, les lignes 20 à 23 de http://pastebin.com/msiLGznV ça sent le bon type enum défini juste avant ta classe. Quant à la ligne 18, je vois mal comment tu pourrais être à la fois const et static (à moins que la valeur soit effectivement connue à la compilation).

vive_cod4
vive_cod4
Niveau 9
01 août 2013 à 00:08:12

Quand tu dis de définir les constantes/enums en dehors de la classe, c'est dans le h mais en dehors de la définition ?

Pour ton dernier paragraphe, peut-être tu n'as pas vu qu'il y a le cpp en dessous ? car pour le static const string FILENAME, en effet c'est connu avant la compilation (cff fichier).

Pour les lgines 20 à 23, c'est juste des indices utilisées pour traiter les résultats de la regex.

godrik
godrik
Niveau 30
01 août 2013 à 00:10:54

un hack qui marche bien est d'utiliser des fonctions template pour retourner les constantes qui vont bien. Comme les teplate sont evaluer a la compilation, tout ce passe bien et tu n'as pas le problemes des intialisationa des champs statiques.

vive_cod4
vive_cod4
Niveau 9
01 août 2013 à 00:26:22

je vais voir tout ça, merci

chris_27
chris_27
Niveau 10
01 août 2013 à 01:19:30

Si c'est connu à la compilation, fais-en une variable globale déclarée dans ton .hpp et définie dans le .cpp correspondant. En tout cas, je n'arrive pas à concevoir le hack de godrik perso... :malade:

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment