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

Auteur Sujet: SoundSource et Status en protected  (Lu 2043 fois)

0 Membres et 1 Invité sur ce sujet

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
SoundSource et Status en protected
« le: Juin 22, 2014, 08:03:18 pm »
Bonjour,

J'aimerais savoir s'il y a une raison particulière au choix de mettre la fonction getStatus() en protected à la place de public dans les SoundSource ?

Je suis actuellement sur un projet et le fait de passer par les SoundSource est beaucoup plus simple que de refaire ma fonction plusieurs fois pour Music, pour Sound et pour mes classes héritant de SoundSource

Voilà un exemple de fonction qui bloque à cause de cela :

bool isPlaying(sf::SoundSource const& source)
{
    return source.getStatus() == sf::SoundSource::Status::Playing;
}

bool isPaused(sf::SoundSource const& source)
{
    return source.getStatus() == sf::SoundSource::Status::Paused;
}

bool isStopped(sf::SoundSource const& source)
{
    return source.getStatus() == sf::SoundSource::Status::Stopped;
}


Je l'ai contré actuellement en faisant comme ceci (mais c'est 4x fois moins simple dans le code appelant ces fonctions...) :

bool isPlaying(sf::SoundSource::Status const& statut)
{
    return statut == sf::SoundSource::Status::Playing;
}

bool isPaused(sf::SoundSource::Status const& statut)
{
    return statut == sf::SoundSource::Status::Paused;
}

bool isStopped(sf::SoundSource::Status const& statut)
{
    return statut == sf::SoundSource::Status::Stopped;
}


Voilà, merci d'avance pour la réponse et si il existe une bonne raison, je vais me résigner à employer ma deuxième méthode :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : SoundSource et Status en protected
« Réponse #1 le: Juin 22, 2014, 10:07:55 pm »
Les fonctions play(), pause() et stop() ne pouvant être définies que dans les classes dérivées, ça n'aurait pas de sens de publier getStatus() dans la classe de base. Imagine qu'une dérivée n'implémente pas play/pause/stop (car elle gère une logique plus haut niveau), on peut imaginer qu'elle ne veuille pas publier getStatus(). En fait cette fonction est définie dans la classe de base parce qu'elle peut techniquement l'être, pas parce qu'elle a du sens à cet endroit. D'où le fait qu'elle soit cachée.

La solution est simple :

template <typename T>
bool isPlaying(const T& source)
{
   return source.getStatus() == sf::SoundSource::Playing;
}


Mais que t'apportent ces fonctions par rapport à un appel direct à getStatus() ?
« Modifié: Juin 22, 2014, 10:48:59 pm par Laurent »
Laurent Gomila - SFML developer

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : SoundSource et Status en protected
« Réponse #2 le: Juin 22, 2014, 10:33:34 pm »
Ah okay, en effet ma classe SoundSource implémente bien son propre play(), pause(), stop() donc je n'ai pas pu remarquer cette chose...

Et ensuite, je m'en veux de ne pas avoir penser aux templates...

Et donc, pourquoi passer par ces fonctions plutôt qu'un test "basique" :

//Test avec les fonctions Template du type isPlaying(source) :
if (isPlaying(maMusique)) { ....}

//Test avec un appel basique, ça marche bien mais je trouve cela un peu moins clair...
if (maMusique.getStatus() == sf::SoundSource::Playing) { ... }
 

Ensuite si on utilse en plus des namespaces et/ou des pointeurs et/ou des conteneurs, on peut se retrouver avec des lignes vraiment plus difficile à lire.

Bon ça apporte vraiment pas grand chose mais je trouve cela un tout petit peu plus propre quand même :)