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 :

vector de classe templatée


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut vector de classe templatée
    Bonjour à tous ,
    Comme l'indique le titre du sujet mon problème se situe au niveau d'un std::vector contenant des classes template. Tout d'abord cette classe template contient des pointeurs que le constructeur de copie est sensé recopier (c'est prévu) mais cela pose un problème que j'ai déjà rencontré et que j'avais déjà détourné même si c'est ici impossible à savoir qu'on ne peut pas mettre le mot const dans le constructeur de copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Particule(const Particule<T> &copy)
    ...
    //coince ici :
    if(copy.getTrajectoryX()!=NULL)
         m_trajectoryX = new ObjectTime<T,double>(copy.getTrajectoryX()); 
    if(copy.getTrajectoryY()!=NULL)
         m_trajectoryY = new ObjectTime<T,double>(copy.getTrajectoryY());
    if(copy.getTrajectoryZ()!=NULL)
         m_trajectoryZ = new ObjectTime<T,double>(copy.getTrajectoryZ());
    if(copy.getSizeVariation()!=NULL)
         m_sizeVariation = new ObjectTime<T,double>(copy.getSizeVariation());
    Avec getTrajectoryX(), getTrajectoryY(), getTrajectoryZ() et getSizeVariation(), des pointeurs sur des objets contenus dans la classe à recopier : on ne peut pas indiquer le mot clé const car du coup le compilateur ne sait pas qu'on ne modifie pas la classe lorsqu'on appelle getTrajectory... car ces accesseurs ne peuvent pas être const vu qu'ils retournent un pointeur.
    C'est pourquoi je bloque déjà ici : est-il possible de déclarer un acceseur const retournant un pointeur ? Sinon comment faire quelque chose équivalent ?
    De plus, j'ai un vector de particule : std::vector<Particule<T> > que je redimensionne lors de la construction de la classe qui le possède :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_particules.resize(numberParticuleTotal,Particule<T>([... arguments de construction de la particule ...]));
    Mais ce code ne fait qu'instancier le premier objet de cette façon, d'après un std::cout placé dans le constructeur approprié qui n'est appelé qu'une fois meme si le tableau est redimensionné de 10 ou de n'importe quelle valeur. J'ai l'impression que tous les autres objets sont construits par copie du premier, c'est pourquoi j'ai besoin d'un constructeur de copie fonctionnel, c'est pourquoi je fait appel à votre aide , car mon constructeur de copie n'accepte pas un objet constant et est donc rejeté à la compilation.
    J'ajouterais également que lorsque je ne fais pas de constructeur de copie, les pointeurs semblent être copiés et les conséquences sont que toutes les particules sont situées au même endroit puisque les pointeurs pointent sur des classes trajectoires qui définissent la trajectoire des particules.

    Voila, j'espère que vous m'aurez plus ou moins bien compris, n'hésitez pas si vous souhaité d'autres explications ou quelques bouts de code

    Merci par avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    template <typename T> const T* Particle<T>::getTrajectory() const { ... } ne fonctionne pas ?

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

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

    http://www.cplusplus.com/reference/stl/vector/resize/
    std::vector::resize(size_type sz, T c = T() );
    Il redimensionne le vector en effectuant une copie de c en cas d'ajout.
    Donc ce que tu constates avec ton cout dans le constructeur est tout à fait normal.

    Avec getTrajectoryX(), getTrajectoryY(), getTrajectoryZ() et getSizeVariation(), des pointeurs sur des objets contenus dans la classe à recopier : on ne peut pas indiquer le mot clé const car du coup le compilateur ne sait pas qu'on ne modifie pas la classe lorsqu'on appelle getTrajectory... car ces accesseurs ne peuvent pas être const vu qu'ils retournent un pointeur.
    C'est pourquoi je bloque déjà ici : est-il possible de déclarer un acceseur const retournant un pointeur ? Sinon comment faire quelque chose équivalent ?
    Si ce sont des accesseurs, ils peuvent être const getTrajectoryX() const, et du coup tu pourras laisser le const.
    Pourquoi tu ne peux pas les mettre const ? parce qu'ils retournent un pointeur ?
    Je ne vois pas le rapport, mais dans ce cas, tu devrais avoir 2 getter, un const et un non const (l'écriture que l'on retrouve dans la stl sur les getter).
    Et au pire, mais cette solution est moche, faire appel à un const_cast puisque ton élément ne sera pas modifié.
    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.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Merci pour vos réponses, je vais voir ce que ça donne
    Je vous tiens au courant

    Edit : Ca marche je ne sais pas pourquoi je pensais que mettre const sur un accesseur sur un pointeur ne fonctionnait pas (j'avais déjà essayé dans d'autres conditions et ça ne marchait pas ^^)

    Merci à vous
    Sujet résolu

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/07/2010, 14h25
  2. Problème avec vector de classe template :(
    Par coyotte507 dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 12h40
  3. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  4. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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