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 :

Polymorphisme en évitant les casts


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut Polymorphisme en évitant les casts
    Bonjour,

    Je me lance dans la conception d'un nouveau soft là, donc j'ai champ libre pour son architecture. Il y a un problème auquel j'ai été confronté plusieurs fois, c'est l'utilisation de l'héritage et du polymorphisme ... Je trouve des solutions qui, d'un point de vue UML, sont propre (enfin, je pense ), mais qui une fois amené au C++ demandent beaucoup trop de de casts à mon gout.

    J'ai deux exemples en tête :

    1. Deux classes d'interfaces, fortement liées entre elles, qui ont toutes deux un système d'héritage.

    Je prend l'exemple d'une classe de traitement, et sa classe de configuration.
    J'ai fait un petit diagramme UML pour que ça soit plus clair :



    Dans cette exemple, je sais d'avance que la classe TraitementVideo, aura un objet de type Configuration Video, de même pour l'audio. Par contre, la donnée sera stocké sous forme de TraitementConfigurationInterface, ce qui m'oblige à faire un cast à chaque fois. Au niveau performance ce n'est pas très grave, vu qu'il s'agira d'un static_cast, mais je trouve pas ça super propre.
    J'ai pensé à utiliser des templates sinon, qui seront spécifié par les classes filles lors du constructeur, mais ça m'a pas l'air dans la philosophie du polymorphisme ...


    2. Mon second problème concerne le polymorphisme pour un objet recu en parametre d'une fonction.

    Là en encore, un petit exemple d'héritage pour que ça soit clair :



    Si l'on reprend mes classes de traitement décrite plus haut, ces dernières vont avoir une méthode de type "computeMessage( const Message & msg)".
    Le problème, c'est que les messages dans mon application vont suivre un chemin de classes de traitement définit à la configuration.
    Ces classes de traitement devront spécifié les messages, du coup je pense être obligé de faire un dynamic_cast pour m'assurer de recevoir le bon type de message. Le problème c'est que les dynamic_cast, niveau performance ca me rebute un peu, mais je ne suis pas sur d'avoir le choix là dessus ... :/
    Comme il ne s'agit pas d'une application destiné au grand public, les plantages pour mauvaise configuration sont tolérés. Est il possible de faire un static_cast et de trouver un moyen de lever une exception sur plantage du à un mauvais type d'objet reçu ?
    De cette manière on peut utiliser des static_cast ce qui nous fait gagner en performance, et en cas de plantage la source d'erreur sera rapide à trouver.
    Images attachées Images attachées   

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    Pourquoi tu veux faire des cast partout???

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    Dans les exemples données, ca serait pour que la classe TraitementVideo puisse acceder aux paramètres qui lui sont propre de la classe Configuration vidéo, et pour que les méthodes computeMsg puisse accèder aux données propres aux messages vidéos.
    (Les diagrammes avec l'audio / video ne sont qu'un exemple pour illustrer, mon programme ne traite pas du tout de ça )

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    dsl, mais je ne comprend où tu as besoin de faire un cast...
    Peux tu mettre une petit code d'exemple?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    Voilà un petit exemple :

    Messages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class Message
    {
    public:
    	unsigned long getLength() const;
    	unsigned char* getBuffer() const;
     
    protected:
    	unsigned char* _buffer;
    	unsigned long _length;
    };
     
    class MessageVideo : public Message
    {
    public:
    	unsigned short getStreamType() const;
    };
    Pour la configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class TraitementConfigurationInterface
    {
    public:
    	virtual bool loadParametersFromFile( const std::string &confFilePath) = 0;
    };
     
    class ConfigurationVideo : public TraitementConfigurationInterface
    {
     
    public:
    	virtual bool loadParametersFromFile( const std::string &confFilePath);
     
    	unsigned float getFrameRate() const;
     
    private:
    	unsigned float _frameRate;
     
    };
    Pour la classe de traitements (qui contient les casts) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    class TraitementInterface
    {
    public:
    	virtual bool computeMessage(const Message * msg) = 0;
     
    protected:
     
    	TraitementConfigurationInterface* _myConf;
     
    };
     
    class TraitementVideo : public TraitementInterface
    {
    public:
    	inline virtual bool computeMessage(const Message * msg)
    	{
    		MessageVideo* messageReceived = dynamic_cast<MessageVideo*> (msg);
    		if(messageReceived)
    		{
    			std::cout<<"Mauvais type de message recu"<<std::endl;
    			return false;
    		}
     
    		if( messageReceived->getStreamType() == META_DATA )
    		{
    			// Traitement ...
    		}
     
    		// .....
     
    		if( (static_cast<ConfigurationVide*>(_myConf))->getFrameRate() < 30.0 )
    		{
    			// Traitement
    		}
    		else
    		{
    			// Autre traitement
    		}
     
    		// ....
     
    		return true;
    	}
    };

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageVideo* messageReceived = dynamic_cast<MessageVideo*> (msg);
    pour le dynamic_cast, ca ne me choque pas. A la limite tu pourrais ajouter un id permettant de savoir ce qu'est msg sans utiliser le dynamic_cast et utiliser static_cast.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (static_cast<ConfigurationVide*>(_myConf))
    Par contre celui là je ne le comprend pas.

    J'ai l'impression que TraitementInterface, TraitementConfiguratioInterface sont trop générique.
    Pourquoi des classes commune pour de la video et de l'audio?

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/05/2007, 22h36
  2. Optimiser un script forum en évitant les sessions
    Par Janitrix dans le forum Langage
    Réponses: 15
    Dernier message: 20/03/2007, 21h30
  3. Question sur les casts
    Par nicolas66 dans le forum C++
    Réponses: 3
    Dernier message: 16/03/2006, 19h03
  4. [Début.] Les CAST
    Par Sylvester dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2005, 22h24

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