Forum de la communauté SFML

Aide => Audio => Discussion démarrée par: Cmdu76 le Juin 30, 2014, 10:02:01 pm

Titre: Conteneurs de musiques
Posté par: Cmdu76 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 :)
Titre: Re : Conteneurs de musiques
Posté par: Laurent le Juin 30, 2014, 10:57:25 pm
Une façon de faire quoi ? Ton code fonctionne là, non ?
Titre: Re : Conteneurs de musiques
Posté par: Cmdu76 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
Titre: Re : Conteneurs de musiques
Posté par: Eho 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.
Titre: Re : Conteneurs de musiques
Posté par: Cmdu76 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 :)
Titre: Re : Conteneurs de musiques
Posté par: Eho 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 [].