Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Conteneurs de musiques  (Lu 3794 fois)

0 Membres et 1 Invité sur ce sujet

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Conteneurs de musiques
« le: Juin 30, 2014, 10:02:01 pm »
Bonjour,

Je travaille actuellement sur un projet pour une gestion de l'audio simplifiée

J'aimerais stocker des sf::Music dans un std::map

Mais le problème est que je n'arrive pas à initialiser la musique directement dans le std::map...

Voilà un exemple qui sera bien plus clair :

std::map<std::string,sf::Music> mMusics;

/*
Le fait que sf::Music soit NonCopyable m'empêche de faire ceci :

sf::Music a;
mMusics.at(filename) = a;
*/


    if(!mMusics.at(filename).openFromFile(filename))
        return false;
    mMusics.at(filename).play();
 

Voilà, je recherche s'il en existe, une façon de faire :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Conteneurs de musiques
« Réponse #1 le: Juin 30, 2014, 10:57:25 pm »
Une façon de faire quoi ? Ton code fonctionne là, non ?
Laurent Gomila - SFML developer

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Conteneurs de musiques
« Réponse #2 le: Juillet 01, 2014, 12:07:57 am »
Eh bien je pensais aussi au départ mais apparement nan...

Je crois que mon sf::Music a besoin d'être initialisé...

Voici l'erreur retournée :

terminate called after throwing an instance of 'std::out_of_range'
  what():  map::at
« Modifié: Juillet 10, 2014, 06:47:07 pm par Cmdu76 »

Eho

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : Conteneurs de musiques
« Réponse #3 le: Juillet 01, 2014, 07:05:20 am »
Bonjour

La méthode .at() de std::map, permet uniquement d'accéder à l'élément.
Si l'élément n'existe pas, tu reçois une exception std::out_of_range.

Si tu veux créer un élément, tu utilises la méthode .emplace(), .insert() ou tout simplement l'opérateur [].
mMusics[filename]; // Création de la musique
Ensuite tu peux y accéder avec la méthode .at() comme dans le reste de ton programme.
« Modifié: Juillet 01, 2014, 07:07:38 am par Eho »

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Conteneurs de musiques
« Réponse #4 le: Juillet 01, 2014, 03:00:03 pm »
Merci beaucoup Eho :)

On m'avait conseillé d'utiliser plus souvent des .at() plutôt que l'opérateur [], il faut croire que chaque méthode a ses avantages :)

Sujet résolu :)

Eho

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : Conteneurs de musiques
« Réponse #5 le: Juillet 01, 2014, 03:23:38 pm »
Et c'est un bon conseil ;)

Il faut utiliser la méthode .at() (C++11) au lieu de l'opérateur [] pour éviter la création involontaire.
Mais lorsque tu veux créer un objet, il faut bien sûr utiliser l'opérateur [].