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 :

Template abstrait et héritage


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Template abstrait et héritage
    Bonjour,

    Sur une plateforme ne diposant pas de la STL, je cherche à implémenter un mécanisme de gestion de listes doublement chaînée générique.

    J'ai donc un template List. Celui-ci fonctionne.

    Je souhaite maintenant créer une version ordonnée de ce template. Je cherche donc un moyen de créer une methode du template list qui insère de manière ordonnée.

    La méthode (grosso-modo) :

    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
    template < typename T >
    class List
    {
    	// ...
    	void insert (const T& elt, const Comparator< T >& compar)
    	{
    		ListCell* curElt = head;
    		while (curElt && compar(curElt, elt))
    		{
    			curElt = curElt->next;
    		}
    		// code d'insertion
    	}
    	// ...
    };
    Le principe est donc basé sur l'utilisation d'une class template abstraite Comparator dont voici la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template < typename T >
    class Comparator
    {
    public:
    	virtual bool operator() (const T& p1, const T& p2) const = 0;
     
    };
    Pour choisir un ordre, je n'ai plus qu'à créer des classes concrètes héritant de la bonne implémentation du template abstrait Comparator :

    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 TrueComparator : public Comparator< MyType* >
    {
    public:
    	inline virtual bool operator() (const MyType*& p1, const MyType*& p2) const
    	{
    		return true;
    	}
    };
     
    class FalseComparator : public Comparator< MyType* >
    {
    public:
    	inline virtual bool operator() (const MyType*& p1, const MyType*& p2) const
    	{
    		return false;
    	}
    };
    Cependant lorsque j'essaye d'utiliser ces classes, je fait (simplification encore) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<MyType*> myListe;
    MyType* myElement = new MyType;
    FalseComparator myComparator;
    myList.insert(myElement, myComparator);
    Mais le compilo visual (essayé sous gcc aussi) me dit que les classes TrueComparator et FalseComparator sont abstraites parce que je n'ai pas surchargé l'operateur "()" .

    Je n'arrive pas à voir où se cache l'erreur, et il y a certainement quelqu'un ici qui a déjà fait un design de ce genre.

    Une idée ?

    Merci.
    Floof

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    As tu essayé sans les inline?

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual bool operator() (MyType* const & p1, MyType* const & p2) const
    const s'applique à ce qui le précède (règle par défaut) et à ce qui le suit si rien ne le précède. Donc const MyType * == MyType const * != MyType* const. Donc tu n'as pas définis une spécialisation de la virtuelle pure mais une surcharge avec un paramètre différent.
    Morale de l'histoire : toujours utiliser l'écriture par défaut T const & et non const T& !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Oo !!

    Merci beaucoup 3DArchi, ça fonctionne comme tu le dis. Je n'aurais jamais trouvé tout seul.

    A+
    Floof.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par floof Voir le message
    Oo !!

    Merci beaucoup 3DArchi, ça fonctionne comme tu le dis. Je n'aurais jamais trouvé tout seul.

    A+
    Floof.
    Le plus important est de retenir la morale de l'histoire :
    Morale de l'histoire : toujours utiliser l'écriture par défaut T const & et non const T& !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. class abstraite et héritage
    Par izissie dans le forum Langage
    Réponses: 5
    Dernier message: 13/09/2012, 17h44
  2. Classe abstraite et héritage
    Par SAKDOSS dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2009, 10h27
  3. Template, Singleton et Héritage
    Par al2000 dans le forum C#
    Réponses: 3
    Dernier message: 19/04/2009, 20h21
  4. Réponses: 17
    Dernier message: 27/08/2007, 18h35
  5. probléme : template multiple et héritage simple.
    Par laetmo dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2006, 02h44

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