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 :

Probleme avec la STL(vector) avec code C


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut Probleme avec la STL(vector) avec code C
    Bonjour,

    Partant d'un code initial en C, j'ai voulu ecrire une classe C++ afin de pouvoir empiler des objets de celle-ci dans un vector de la STL.
    Jusqu'ici ca va. j'ai bien lu la FAQ et j'ai reussi a cree mon vecteur et a faire des push_back de mes objets.
    Mais la ou ca coince c'est pour les elements de ma classe que j'ai repris tels quels d'un code C, et qui sont des pointeurs sur structure. Un collegue m'a suggere que quand je faisais un push_back type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_vector.push_back(Ma_classe(mes_parametres));
    ce que faisait la STL c d'abord appeler normalement le constructeur pour mon nouvel objet, puis tenter de copier son contenu dans le vector, et que dans cette operation les variables passeraient bien mais pas les pointeurs sur structure que j'ai, qui se metteraient a deconner.
    Il m'a alors conseille de faire un vecteur non pas de la classe mais de pointeurs de la classe, c-a-d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Ma_classe*> mon_vector;
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Ma_classe> mon_vector;
    comme je fais actuellement.

    Le probleme, c'est que j'ai essaye, mais qu'en faisant comme conseille je n'arrive plus a acceder aux variables des objets crees dans mon vector, ca plante a la compilation. Alors que dans le deuxieme cas (vecteur de classe normal) ce n'est pas a la compilation, mais a l'execution que je me paie un segmentation fault parce que les pointeurs n'ont pas (ou mal) ete recopies...

    Merci d'avance de votre aide, jsuis completement bloque, ce genre de pb me depasse... c dur de concilier C et C++ parfois...

  2. #2
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Dans le premier cas, il te faut un constructeur par copie correcte.
    Dans le deuxieme cas, il faudrait nous monter ton code mais a priori, ca doit fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Maclasse * tmp = new MaClasse(mes parametre)
    mon_vector.push_back(tmp);

  3. #3
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Pour le deuxieme cas, c-a- d ce que je fais actuellement et qui plante a l'execution sur les pointeurs, j'ecris pour ma part directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_vecteur.push_back(Maclasse(mesparametres));
    ce qui doit revenir au meme avec ce que tu as ecris, mais pour le premier cas je ne comprends pas ton conseil, comment pourrais-je fais un constructeur par copie propre ?


    Voila l'erreur de compilation que je me paie quand je suis dans le cas d'un vecteur de pointeurs vers la classe (1er cas) et que j'essaie d'acceder a un parametre short tout con, appele "featcoeff", c-a-d:
    erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    melfilt.cxx:1595: error: request for member `featcoeff' in `(mf + 
       460)->std::vector<_Tp, _Alloc>::operator[] [with _Tp = Scdnet*, _Alloc = 
       std::allocator<Scdnet*>](i)', which is of non-class type `Scdnet*'
    Scdnet etant ma classe.
    mf est un struct contenant mon vecteur

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Benjy
    Voila l'erreur de compilation que je me paie quand je suis dans le cas d'un vecteur de pointeurs vers la classe (1er cas) et que j'essaie d'acceder a un parametre short tout con, appele "featcoeff", c-a-d:
    là tu essais d'accéder au membre featcoeff de std::vector, qui n'existe pas.
    http://c.developpez.com/faq/cpp/?page=STL#STL_vector
    c'est comme si tu écrivais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Maclasse v[ 10 ];
    v.featcoeff;
    je te laisse corriger

  5. #5
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Bon , alors maintenant ca marche apres que j'ai fait ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    std::vector<Ma_classe*> mon_vector;
     
    Ma_classe *tmp = new Ma_classe(parametres);
    mon_vector.push_back(tmp);
     
    int i=0; // premier objet ajoute
    Ma_classe* tmpnet = mon_vector[i]
    short mon_parametre = (*tmpnet).featcoeff;
    (*tmpnet).ma_fonction_perso();
    C'est bon non ?

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par Benjy
    Bon , alors maintenant ca marche apres que j'ai fait ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    std::vector<Ma_classe*> mon_vector;
     
    Ma_classe *tmp = new Ma_classe(parametres);
    mon_vector.push_back(tmp);
     
    int i=0; // premier objet ajoute
    Ma_classe* tmpnet = mon_vector[i]
    short mon_parametre = (*tmpnet).featcoeff;
    (*tmpnet).ma_fonction_perso();
    C'est bon non ?
    c'est pas très joli


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::vector<Ma_classe*> mon_vector;
    mon_vector.push_back(new Ma_classe(parametres)); // là j'ai un petit doute ?
     
    int i=0; // premier objet ajoute
    short mon_parametre = mon_vector[i]->featcoeff;
    mon_vector[i]->ma_fonction_perso();

  7. #7
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    OK oui c pareil et plus court a ecrire

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Pense au delete aussi.
    http://c.developpez.com/faq/cpp/?pag...lete_array_dim
    Ou n'utilise pas de pointeur, ou des pointeurs intelligents:
    http://c.developpez.com/faq/cpp/?pag...S_intelligents
    car ça devient vite complexe si tu veux quelque chose de robuste.

  9. #9
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Pour l'instant pour supprimer je ne fais qu'un Mais il parait que comme ca, ca tue bien le vecteur mais ca ne libere pas la memoire allouee pour les differents objets que j'ai ajoute dedans. Comment faire alors ? Une boucle sur les elements et faire du delete ?

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Voilà, voir les liens donné ci-dessus.

  11. #11
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Hum j'ai fait des avec une boucle sur tous les objets de mon vecteur avant de le clearer lui aussi mais ca me fait un segmentation fault...

  12. #12
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    OK bah j'ai fait des delete simples et ca marche 8)

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    BEn c'est logique, un new appelle un delete et un new[] un delete[]

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/07/2008, 09h39
  2. Probleme avec la classe vector
    Par sylvain.cool dans le forum SL & STL
    Réponses: 16
    Dernier message: 09/06/2008, 15h36
  3. problem de vector avec une classe
    Par potterthekiller dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/03/2007, 11h11
  4. probleme avec la classe vector
    Par elekis dans le forum Langage
    Réponses: 4
    Dernier message: 12/04/2006, 16h25
  5. Probleme avec parcours de stl::vector
    Par MDiabolo dans le forum SL & STL
    Réponses: 10
    Dernier message: 08/03/2006, 00h35

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