Liste de classes template [Résolu]

Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention - 7 juin 2008 à 15:16 - Dernière réponse : Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention
- 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.

Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 7 juin 2008 à 16:21
3
Merci
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;

Merci luhtor 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de luhtor
Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention - 8 juin 2008 à 11:10
0
Merci
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!

Commenter la réponse de Rouliann
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 8 juin 2008 à 13:04
0
Merci
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.
Commenter la réponse de luhtor
Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention - 8 juin 2008 à 15:16
0
Merci
Oui c'est à peu près ça ;-)

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

Commenter la réponse de Rouliann

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.