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

SL & STL C++ Discussion :

Classe dérivée et conteneur [Débutant(e)]


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 6
    Par défaut Classe dérivée et conteneur
    Bonjour à tous,

    Dans un code où je possède une classe de base et deux classes en dérivant, je cherche à manipuler des vecteurs de pointeurs vers ces classes.

    Je souhaiterais pouvoir utiliser les pointeurs ainsi stockés indifféremment selon qu'ils pointent vers une classe dérivée ou non.

    PS: je suis nouveau dans le monde merveilleux de l'objet (oui, j'aime les printf )

    Je mets ci-dessous un petit bout de code pour expliciter ce que je veux faire :




    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    // Compilateur : Visual C++ 2005
     
    class base
    {
    	public:
    	virtual void bonjour() { printf("Bonjour de base!\n"); }
    };
     
    class derivee1 : public base
    {
    	public:
    	virtual void bonjour() { printf("Bonjour de derivee1!\n"); }
    };
     
    class derivee2 : public base
    {
    	public:
    	virtual void bonjour() { printf("Bonjour de derivee2!\n"); }
    };
     
    void fonctionTest_simple(base* b)
    {
    	b->bonjour();
    }
     
    void fonctionTest_vector(std::vector<base*> v)
    {
    	v[0]->bonjour();
    }
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	base b;	base *pb; std::vector<base*> vb;
    	derivee1 d1; derivee1 *pd1; std::vector<derivee1*> vd1;
    	derivee2 d2; derivee2 *pd2; std::vector<derivee2*> vd2;
     
    	pd1=&d1;
    	vd1.push_back(pd1);
    	fonctionTest_simple(pd1);   // compile
    	fonctionTest_vector(vd1);   // ne compile pas   -- et j'aurais voulu que ca marche :(
    	getchar();
     
    	return 0;
    }

    Dans mon appli. complète, je stocke des vecteurs de pointeurs de l'une ou l'autre classe dérivée, et les "caster" un par un serait un peu lourd.

    Quelqu'un a-t-il une idée pour faire ce qui pourrait s'appeler du polymorphisme dans un conteneur ?

    Ou me suis-je complètement fourvoyé et ce problème est le signe d'une mauvaise découpe de mon problème en classes ?

    Merci d'avance aux Gurus du C++ qui pourront éclairer mon chemin.

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    En fait, le problème, c'est que ton vector <base> n'est pas la classe dérivée de vector <int>.

    Mais il existe une autre méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    void fonctionTest_vector(std::vector<T> v)
    {
    	v[0]->bonjour();
    }
    En fait, tu peux mettre un vector de n'importe quelle type du moment que v[0] possède une méthode bonjour, et si par malheur le type n'en a pas, tu as une erreur de compilation, donc pas de danger!

    Je crois que tu pourrais encore faire mieux (ou pire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    void fonctionTest_vector(T v)
    {
    	v[0]->bonjour();
    }
    Là tu peux même utiliser ta fonction sur des tableaux qui contiennent des pointeurs qui pointent sur des éléments du type 'classes dérivées de base', pas seulement sur des vectors.
    Enfin si tu connais pas les templates, n'hésite pas à poser des questions.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu veut utiliser le polymorphisme??? C'est de ca que tu parle??
    essai ce main alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc, char** argv)
    {
    	; std::vector<base*> vb;
     
    	vb.push_back(new derivee1 );
            vb.push_back(new derivee2 );
            vb.push_back(new derivee1 );
            vb.push_back(new derivee2 );
     
    	fonctionTest_vector(vb);   
    	getchar();
     
    	return 0;
    }
    et pour l'interface de ta fonction fonctionTest_vector, prefère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonctionTest_vector(std::vector<base*> const & v)

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Oui c'est vrai que ce serait mieux de faire une variable , puis d'ajouter tous tes pointeurs (même ceux des classes dérivées), à ce vecteur, plutôt que de faire un , enfin si c'est que tu veux.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 6
    Par défaut
    Merci pour vos éléments de réponse.

    Comme dans mon projet j'avais des conteneurs disséminés un peu partout, certains déclarés contenant une classe de base, et d'autres déclarés comme contenant une des classes dérivées, cela posait problème.

    J'ai contourné l'obstacle en déclarant tous mes conteneurs comme contenant la classe de base, et j'utilise un dynamic_cast<classeDerivee*>(pointeurSurClasseDeBase *) quand nécessaire (une des classes dérivées contient une méthode que la classe de base ne contient pas).

    Je suppose que ce n'est pas la facon de faire la plus propre, mais le découpage en objets ne m'est pas encore très intuitif .

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Boost fournie des contenaire qui gère les pointeur.
    peut etre plus interessant pour toi

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par Esiee-Tooms Voir le message
    Je suppose que ce n'est pas la facon de faire la plus propre, mais le découpage en objets ne m'est pas encore très intuitif .
    Je te le confirme.
    Pourquoi l'utilisation du downcasting est-il souvent une pratique à éviter ?

Discussions similaires

  1. unique conteneur pour plusieurs classes dérivées
    Par jeanjack dans le forum SL & STL
    Réponses: 5
    Dernier message: 18/04/2009, 18h57
  2. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  3. Réponses: 4
    Dernier message: 20/11/2005, 05h48
  4. [MFC] CArray et classe dérivée?
    Par TigreRouge dans le forum MFC
    Réponses: 14
    Dernier message: 02/08/2005, 22h45
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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