Design de classe

Design de classe - C++ - Programmation

Marsh Posté le 16-06-2006 à 14:43:42    

Bonjour à tous,
 
comme le titre l'indique, j'ai un souci de design de classe.
 
J'ai créé trois classes qui me permettent d'afficher de la vidéo
grâce à DirectShow.
 
J'ai une classe DS_InfosVideo, DS_AffichVideo, qui sont assez
explicites, et une dernière classe TVideoAffich qui est la fenêtre
qui affichera la vidéo, et qui a comme membres privés les deux
classes précédentes...
 
Je peux afficher 3 types de vidéo: les fichiers vidéo, des fichiers
XML pour la prévisualisation de montages vidéo, et de la vidéo en
temps-réel provenant d'une caméra numérique.
 
J'ai donc utilisé l'idiome du constructeur nommé pour chacune de ces
3 classes, ce qui me permet de charger les bonnes infos.
 
Par exemple, pour un fichier vidéo:
 

Code :
  1. class TVideoAffich
  2. {
  3. private:
  4. DS_InfosVideo * Infos;
  5. DS_AffichVideo * Affich;
  6. public:
  7. static TVideoAffich * CreateFromFile(const std::string & path)
  8. {
  9. Infos = DS_InfosVideo::CReateFromFile(path);
  10. Affich = DS_AffichVideo::CReateFromFile(path);
  11. }
  12. };


 
Pour l'instant, je limite le rendu de la vidéo à un renderer que j'ai
choisi.
 
Ce que j'aimerai faire maintenant, c'est proposer d'autres choix de
renderer.
 
Mais je ne me vois pas faire des fonctions du genre pour chacune des
classes:
 

Code :
  1. static TVideoAffich * CreateFromFileVMRRenderer(const std::string & path);
  2. static TVideoAffich * CreateFromFileBasicRenderer(const std::string & path);
  3. static TVideoAffich * CreateFromSBEVMRRenderer(const std::string & path);


 
etc...
 
Je voyais bien un truc du genre:
 

Code :
  1. template <class Input>
  2. class DS_InfosVideo : public Input
  3. {
  4. public:
  5. DS_InfosVideo(const std::string & path);
  6. };
  7. template <class Input , class Renderer>
  8. class TVideoAffich : public Input, public Renderer
  9. {
  10. private:
  11. DS_InfosVideo<Input> * Infos;
  12. DS_AffichVideo<Input,Renderer> * Affich;
  13. public:
  14. TVideoAffich(const std::string & path);
  15. };


 
Seulement la classe Input passée à TVideoAffich n'est pas la même
que celle que doit recevoir DS_InfosVideo ni celle de DS_AffichVideo...
 
Est-ce que c'est possible de poser des conditions à la compilation, de
telle sorte qu'on ait un truc du genre:
 
pour TVideoAffich

Code :
  1. si Input == VideoAffichInputFile
  2. {
  3.     DS_InfosVideo<Infos_Input_File> * Infos;
  4.     si Renderer == VideoAffichVMRRenderer
  5.         DS_AffichVideo<Affich_Input_File,Affich_VMR_Renderer> * Affich;
  6.     sinon
  7.         DS_AffichVideo<Affich_Input_File,Affich_Basic_Renderer> *
  8. Affich;
  9. }
  10. sinon
  11. {
  12. ///
  13. }


 
Voilà tout :)
 
Merci d'avance
 
Mike

Reply

Marsh Posté le 16-06-2006 à 14:43:42   

Reply

Marsh Posté le 16-06-2006 à 19:34:35    

J'ai pas tout suivi... il me semble cependant que tu ai besoin de classes polymorphes.
 
C'est à dire, (c'est approximatif, hein) une classe VideoInput avec des méthodes virtuelles, et plusieurs classes VideoInputFile, VideoInputXML, et VideoInputCamera, qui dérivent de VideoInput et réimplémentent les fonctions virtuelles.

Reply

Marsh Posté le 21-06-2006 à 20:55:32    

Et pourquoi pas un truc comme ca :

Code :
  1. static TVideoAffich * CreateFromFile<Renderer>(const std::string & path);


Classieux, élégant, chaud pour l'hiver ...

Reply

Marsh Posté le 21-06-2006 à 21:29:40    

un singleton ?

Reply

Marsh Posté le 21-06-2006 à 21:56:23    

_darkalt3_ a écrit :

un singleton ?

:??:  

Reply

Marsh Posté le 21-06-2006 à 22:50:13    

le pattern Abstract Factory me semble tout indiqué !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed