OVH Cloud OVH Cloud

Type générique (enfin je crois)

3 réponses
Avatar
Geoffroy Baud
Bonjour,
comment puis-je faire un type générique,
je vous explique, je suis entrain de faire
un ptit programme, qui est sensé afficher
des images, je dois geré évidemment
plusieur type d'image, jpeg, jpeg2000 dicom3, tiff, etc.

J'ai donc fais plusieur class (une par type d'image).
Elles héritent toutes d'un class abstraite image
qui contient une methode vituel pur, "decode"
qui comme son nom l'indique decode l'image et me
retoure le raw (const char*).

Le problème c'est que je dois connaitre le type
de l'image pour pouvoir l'instancier.

connaisser vous un moyen, pour faire en sorte que
je puisse directement lui passer un pointeur
sur l'image (void*) sans avoir a me soucier de sont
type(reel) et qu'elle me retourne le bonne objet.

par exemple:


void* monimage -> type_generique -> (test) -> c'est un jpeg
retour jpeg*

je ne sais si je suis claire, dans le cas contraire je donnerais
des précisions.


d'avance un grand merci.

--
GB

3 réponses

Avatar
Jean-Marc Bourguet
Geoffroy Baud writes:

je ne sais si je suis claire, dans le cas contraire je donnerais des
précisions.


Pas trop. Recherche "constructeurs virtuel" et "idiome
lettre/enveloppe", c'est deux choses auxquelles ta description de
probleme me fait penser, mais je ne sais pas laquelle est la solution
a ton probleme ou s'il a des caracteristiques qui rendent necessaire
une autre.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Cyrille Karmann
Geoffroy Baud disait:

je ne sais si je suis claire, dans le cas contraire je donnerais
des précisions.


Pas sur d'avoir tout compris. Est-ce que le code qui suit répondrait à
ton problème?

class Image
{
// tout un bazard...

public:
static Image * createImage(void *);
};

Image * createImage(void *data)
{
if (c_est_un_jpeg(data))
return new JPEGImage(data);
else if (c_est_un_png(data))
return new PNGImage(data);

// etc.
}

--
Cyrille

Avatar
Loïc Joly
Geoffroy Baud wrote:

Bonjour,
comment puis-je faire un type générique,
je vous explique, je suis entrain de faire
un ptit programme, qui est sensé afficher
des images, je dois geré évidemment
plusieur type d'image, jpeg, jpeg2000 dicom3, tiff, etc.

J'ai donc fais plusieur class (une par type d'image).
Elles héritent toutes d'un class abstraite image
qui contient une methode vituel pur, "decode"
qui comme son nom l'indique decode l'image et me
retoure le raw (const char*).

Le problème c'est que je dois connaitre le type
de l'image pour pouvoir l'instancier.

connaisser vous un moyen, pour faire en sorte que
je puisse directement lui passer un pointeur
sur l'image (void*) sans avoir a me soucier de sont
type(reel) et qu'elle me retourne le bonne objet.


Je ne vois pas trop ce que souhaite faire. D'où vien ce void* ? Qui l'a
crée ? A priori, c'est ça que tu dois modifier pour qu'il crée un objet
du bon type. Par exemple, quand ton utilisateur choisi d'ouvrir
toto.jpg, tu peux créer un objet du type jpeg, éventuellement avec une
fonction factory (version simpliste) :

image *createImage(string filename)
{
string extension = extractExtension(fileName);
if(extension == "jpg")
return new jpeg(filename);
if(extension == "tif")
return new tiff(filename);
}


Enfin, j'aurais tendance à avoir une structure de classe différente, car
ce qui différencie un jpeg d'un tiff, c'est uniquement la
lecture/écriture dans un fichier, une fois chargé, c'est pareil, et de
plus, on veut pouvoir lire une image en jpeg et l'enregistrer en tiff,
sans forcément dupliquer l'image en mémoire.

J'aurais donc une classe image sans héritage, une classe abstraite
fileReader et une autre fileWriter, toutes deux dérivées en fonction des
formats (par exemple, fileWriter aurais une fonction virtuelle pure
permettant d'afficher une boîte de dialogue avec les options de
sauvegarde spécifiques à un type), et image utiliserait ces deux classes.

--
Loïc