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 :

Vector et classes abstraites


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut Vector et classes abstraites
    Bonjour,

    voila mon problème :

    j'ai une classe Elem_impacteur qui est la classe mère des classes suivantes :
    Elem_X_impacteur
    Elem_L_impacteur
    Elem_T_impacteur

    Elem_impacteur est une classe abstraite pure donc non instanciable.

    j'essai dans une méthode d'ajouter des éléments a un vector<Elem_impacteur*>
    pour cela je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<Elem_impacteur*> collect_super_elem_etrave;
    Elem_impacteur* elem_T = new Elem_T_impacteur();
    //je donne ensuite des valeur au attributs d elem_T
    collect_super_elem_etrave.push_back(elem_T);

    je remarque que dans le vector le push.back s'est mal déroulé les éléments de la collection sont identiques.

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Je ne vois rien de choquant dans ce code.

    Au hasard, le vector ne serait-il pas passé par copie plutôt que par référence a la méthode?

    Si ce n'est pas ça, pourriez vous nous donner un code plus complet reproduisant l'erreur?

  3. #3
    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
    Par défaut
    Citation Envoyé par vbaddict44 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<Elem_impacteur*> collect_super_elem_etrave;
    Elem_impacteur* elem_T = new Elem_T_impacteur();
    //je donne ensuite des valeur au attributs d elem_T
    collect_super_elem_etrave.push_back(elem_T);

    je remarque que dans le vector le push.back s'est mal déroulé les éléments de la collection sont identiques.
    J'espère que ce n'est pas le code que tu utilises, sinon ça veut dire que tu recrées un vecteur a chaque fois et que tu le détruit quant il sors du scope.

    On ne peut pas vraiment t'aider sans un exemple minimal mais complet qui montre le probleme. D'ailleur je pense qu'en faisant ça tu vas comprendre d'ou viens le probleme toi même.

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    le tableau est un variable de classe dans mon code je l'est mit ici pour essayer de vous faire comprendre mon code.

    voici la quasi totalité de la méthode en question:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    int navireimpacteur::creer_T(double& wb, double& beta,bool etrave,bool bulbe,bool borde_bulbe,double& x1,double& y1,double& z1,double& x2,double& y2,double& z2,double& x3,double& y3,double& z3,double& x4,double& y4,double& z4,Structure* sbarre,Structure* spied)
    {
     
        Elem_impacteur* elem_T = new Elem_T_impacteur();
        node n1 ;
        node n2 ;
        node n3 ;
        node n4 ;
        int nb_super_elem = 0;
     
     
     
     
        if(etrave && !bulbe)
        {
            nb_super_elem = nb_super_elem_etrave;
            nb_elem_T_etrave++;
     
        }
        else if(!etrave && bulbe)
        {
            nb_super_elem = nb_super_elem_bulbe;
            nb_elem_T_bulbe++;
        }
     
        nb_super_elem++;
        nb_node ++;
        n1.set_label(nb_node);
        n1.set_x(x1);
        n1.set_y(y1);
        n1.set_z(z1);
        elem_T->setNode1(&n1);
     
        nb_node++;
        n2.set_label(nb_node);
        n2.set_x(x2);
        n2.set_y(y2);
        n2.set_z((z1+z2)/2);
     
        elem_T->setNode2(&n2);
     
        nb_node++;
        n3.set_label(nb_node);
        n3.set_x(x3);
        n3.set_y(y3);
        n3.set_z((z1+z3)/2);
        elem_T->setNode3(&n3);
     
        nb_node++;
        n4.set_label(nb_node);
        n4.set_x(x4);
        n4.set_y(y4);
        n4.set_z((z1+z4)/2);
        elem_T->setNode4(&n4);
        elem_T->setEtat("NON IMPACTE");
     
    if(etrave && !bulbe)
        {
            nb_super_elem_etrave = nb_super_elem;
            collect_super_elem_etrave.push_back(elem_T);
        }
        else if(!etrave && bulbe)
        {
            nb_super_elem_bulbe = nb_super_elem;
            collect_super_elem_bulbe.push_back(elem_T);
        }
     
    //affichage du contenu du tableau
        for(std::vector<Elem_impacteur*>::iterator p = collect_super_elem_etrave.begin(); p!=collect_super_elem_etrave.end();++p)
        {
            std::cout<<" label T elem_T : "<<(*p)->retour_node2()->retour_y() << " coordonnees Z noeud 2 "<<(*p)->retour_node2()->retour_z() << std::endl;
        }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le code semble correct, c'est la manière de remplir un vecteur en tous cas.

    Je ne comprends pas le problème que tu penses rencontrer
    je remarque que dans le vector le push.back s'est mal déroulé les éléments de la collection sont identiques.
    Par contre, le code est barbare, beaucoup de if, on y croise 2 vecteurs, pour n'en afficher qu'un seul, des index/compteurs un peu partout.
    Quel est donc le problème réel ? Tu es sûr de regarder au bon endroit ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    Ce que je voudrait c'est vérifier que les valeurs du tableau sont bien différentes.
    mais quand je fait une boucle d'affichage bizarrement les valeur sont toutes identiques je ne sait pas pourquoi. l'endroit ou je fait mon affichage n'est peut être pas bon ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Ton code fonctionne sans exploser ?
    Quand je vois des setNode1(&n1) où n1 est local à la fonction, je me demande.
    Pourquoi passer x,y,z par référence alors que ce ne sont pas des valeurs de retour ?

    Quant à l'affichage, tu n'affiches que collect_super_elem_etrave, alors que ton code traite aussi collect_super_elem_bulbe

    Mais c'est surtout le design qui me parait bancal en fait. Créer un vector pour chaque type fille, c'est pas top.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(etrave && !bulbe)
        {
            nb_super_elem_etrave = nb_super_elem;
            collect_super_elem_etrave.push_back(elem_T);
        }
        else if(!etrave && bulbe)
        {
            nb_super_elem_bulbe = nb_super_elem;
            collect_super_elem_bulbe.push_back(elem_T);
        }
    Il y a donc deux cas ( etrave && bulbe et !etrave && !bulbe ) où tu n'insert rien dans ton vecteur.

    A mon avis, tu as un problème de logique parceque tu n'as pas géré ces cas.
    Commence par rajouter un log ou un breakpoint dans un dernier else pour vérifier que ça passe bien par là.

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    Klaim pas de soucis de ce coté la on passe bien obligatoirement dans un de c'est deux cas.
    Bousk le code tourne mais le soucis c'est juste que l'affichage du tableau collect_super_elem_etrave me fait des choses assez bizarres

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    "le code tourner mais le résultat est bizarre", donc il tourne pas si bien que ça.

    Dans mon esprit tordu, je vois une possibilité de tomber en marche, et ce sont justement ces n1, n2, n3, n4 qui en sont la cause, parce que setNodeI me parait plus que suspecte, en prenant &nI en paramètre.

    Si par hasard, les différents nI ont toujours la même adresse sur la pile, par chance chaque elem_T aura la même adresse de ses nI.
    Et par chance, l'affichage dans la fonction, alors que les nI ne sont pas encore détruits, ne provoquent pas de crash, et tous les elem_T partagent les mêmes nI.

    Bref, je suis dubitatif.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    par tourner je voulais dire compiler :-).

    J'ai essayé de mettre des setNode1(n1) ou lieu de setNode1(&n1) en modifiant les accesseurs mais la j'ai une erreure qui me dit node1 node2 node3 et node4 has incomplete type.
    Il y a une problème d'inclusion il me semble car en utilisant les pointeurs comme c'était le cas avant je n'avait pas ce problème.

  12. #12
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    Problème résolu merci tu es trop fort Bousk.
    le soucis venait bien du setNode(&n1)
    j'avais fait ça au début pour contourner le problème d'inclusion cyclique que j’avais (quel idiot je suis)

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

Discussions similaires

  1. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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