Liste de classes template

Résolu
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 7 juin 2008 à 15:16
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 8 juin 2008 à 15:16
Bonjour à tous.

Mon problème est le suivant :

J'ai une classe que je définis comme ceci

template <typename T> class property{

        string name;

        T value;

        public:

        property();

        /* ... */

}

et je voudrais faire une liste chainée d'objets de type property, mais dans laquelle chaque maillon pourrait etre de type différent (par exemple property ou property<string> ), du genre :

struct maillon{

        property *p;                // sans spécifier le type

        struct maillon *next;

};
typedef struct maillon *liste;

Est-ce possible ?? si oui comment ?

Je l'avais déjà fait en C avec des pointeurs génériques à la place des templates mais j'aimerais savoir si c'est possible autrement.

Merci.

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 juin 2008 à 16:21
class propertyBase
{
...
}

template <typename T> class property : public propertyBase
{


        string name;


        T value;




        public:


        property();


        /* ... */


}

struct maillon{        propertyBase *p;                // sans spécifier le type

        struct maillon *next;

};
typedef struct maillon *liste;
3
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
8 juin 2008 à 11:10
Et donc là, pour créer un nouvel objet je fais
propertyBase *p;

p = new property<le-type-que-je-veux>;

c'est correct ?

En tout cas merci beaucoup j'avais pas pensé à ça!

0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 juin 2008 à 13:04
Oui c'est correct, mais bien évidemment, tu ne connais pas le type dans la liste chainée, puisque tu n'as que des pointeurs de la classe de base. Mais tu n'as pas besoin de connaitre le type pour ce que tu veux faire (enfin ce que tu sembles vouloir faire).

Mais les définitions suivantes sont surement plus correctes dans ton cas:

class propertyBase
{
string name;
...
public:

virtual bool SetValue(const string &) = 0;
virtual string GetValue() = 0;
}

template <typename T> class property : public propertyBase
{

        T value;
...

virtual bool SetValue(const string & _chaine)
{
std::istringstream iss(_chaine);

return ((iss >> value) && (iss.eof());
}

virtual string GetValue()
{
std::ostringstream oss(value);

return oss.str();
}

}

Le champ "string name" est commun à toutes les propriétés, donc autant le placer dans la classe de base.
 Bien sur la fonction "SetValue" et "GetValue" ne sont que exemple de  ce que tu pourrais avoir.
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
8 juin 2008 à 15:16
Oui c'est à peu près ça ;-)

Encore merci, parce-que je bloquais depuis plusieurs jours sur ce problème.

0
Rejoignez-nous