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

C++ Discussion :

Polymorphisme + New


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut Polymorphisme + New
    Les classes:
    J'ai une classe abstraite Individu puis deux classes héritant de cette classe Individu, Homme et Femme.

    Maintenant j'ai une classe listIndividu et j'ai envie de créer une fonction
    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
     
    class listIndividu
    {
    public:
    Individu * list;
    Individu * new_individu_size(Individu * ind,int n)
    {
       return list =  new ???[ n]; // la je veux créer n femmes ou hommes 
    //selon la liason du pointeur dynamique
     
    }
    };
    int main()
    {
    Femme* f;
    listIndividu list;
    list.new_individu_size(f,3);
     
    }
    Comment faire???

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Est-ce assez clair???

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par vincho
    Est-ce assez clair???
    Pas vraiment, tu veux faire quoi exactement? Une liste chaînée d'individus?

    Remarque que pour utiliser le polymorphisme avec un tableau, tu es obligé d'utiliser un tableau de pointeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Individu *tab[2];
    tab[0] = new Femme();
    tab[1] = new Homme();
    Pour t'aider plus précisément il faudrait plus d'informations sur ce que tu essaies de faire...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Je veux créer une liste d'individu correspondant au pointeur de la liaison dynamique de l'argument de la fonction new_individu_size.

    En vérité, je travaille en traitement d'images, et je voudrais créer une image qui est une liste de voxel sachant que les voxels peuvent être différents.
    donc:
    une fonction new_voxel_size quelques soient le voxel

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Et à la compilation je ne sais pas quel type de voxel ou d'individu (Homme ou femme), la liste va contenir.

    C'est à l'éxécution que la lister va créer une liste de femme ou d'homme...

    c'est pourquoi je veux faire appel à une fonction:
    new_individu_size(Individu * ind,int n)
    et selon le lien dynamique creer le bon type

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Ton image tu connais sa taille, elle a par exemple m*n voxels? Dans ce cas, comme j'ai fais plus haut, tu pourrais faire un tableau de pointeurs de taille m*n.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    De toute évidence c'est ton instance qui va savoir si elle est un homme ou une femme ; c'est donc à elle qu'il va falloir demander de créer des instances du même type. C'est en quelque sorte une extension du design pattern du clone.

    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
    class Individu
    {
    public :
     
        virtual Individu* Clone(int Count) = 0;
    };
     
    class Homme : public Individu
    {
    public :
     
        virtual Individu* Clone(int Count) {return new Homme[Count];}
    };
     
    class Femme : public Individu
    {
    public :
     
        virtual Individu* Clone(int Count) {return new Femme[Count];}
    };
     
    Individu * new_individu_size(Individu * ind, int n)
    {
        if (ind)
            return ind->Clone(n);
        else
            return NULL;
    }

  8. #8
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par vincho
    Comment faire???
    Tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class listIndividu
    {
    public:
    	Individu * list;
    	template<typename T>
    	Individu * new_individu_size(T* ind,int n)
    	{
    	   return list =  new T[ n];
    	   // ici tu remplis ton tableau
    	}
    }
    Mais ton code est bizare, on peut imaginer un cas dans lequel ce conteneur que tu fais ait un sens, mais il s'agit d'un cas tout de même assez alambiqué.

    Le code que j'ai écris ci-dessus compile et peut marcher, si tu sais VRAIMENT ce que tu fais. Mais c'est pas très joli joli.

    Si tu débutes en C++ et que tu veux utiliser un tableau de taille variable, tu devrais te documenter ici
    plutot que d'essayer d'en faire un toi-même.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci de vos réponses:

    Je vais garder la solution de Feriaman car elle me permet de ne pas définir pour chaque class Homme, Femme, enfants, chiens, cochons... la fonction clone que me propose Laurent Gomila.

    Encore Merci,
    Ca compile, Youpi!!!!!!!!!!

  10. #10
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    J'aurais mieux fait de me taire.

    Le code que j'ai écris ci-dessus compile et peut marcher, si tu sais VRAIMENT ce que tu fais. Mais c'est pas très joli joli.
    Ma "solution" n'est pas bonne, et elle va poser un certain nombre de problèmes par la suite.

    Notament, tu vas devoir caster ta liste avant de t'en servir.
    Tu ne dois pas utiliser cette solution.

  11. #11
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    J'explicite : ta variable list "croit" qu'elle pointe sur un tableau de A, alors qu'elle pointe sur un tableau de B, elle n'est donc pas capable de retrouver ses propres éléments, du coup, ce code :
    renvoie n'importe quoi et surtout pas le second élément du tableau.

    Le premier élément du tableau serait renvoyé par exemple par :
    si c'est un tableau de femmes.

    C'est très moche comme solution.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merci, je vais donc implanter clone dans chacune des classes!!!!

    Je croyai que la force de C++ était de pouvoir s'abstenir d'écrire n fois la même fonction; ici clone.
    J'aurai du rester au C pure

Discussions similaires

  1. Polymorphisme, new et reference
    Par Bouteille dans le forum Langage
    Réponses: 5
    Dernier message: 11/01/2012, 12h08
  2. Réponses: 4
    Dernier message: 24/03/2004, 12h37
  3. Database new user & create table
    Par MFDev dans le forum InterBase
    Réponses: 3
    Dernier message: 30/09/2003, 20h47
  4. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30
  5. [] Insérer DE et Datareport existant ds new projet
    Par khany dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/01/2003, 09h52

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