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 :

.begin et recopie d'objets


Sujet :

SL & STL C++

Vue hybride

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut .begin et recopie d'objets
    Bonjour

    J'ai créée une classe Wall qui contient un vecteur de vecteur d'objet "Brick" et une methode getConstWall() qui me retourne la référence du vecteur:

    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
    Wall::Wall(int numberW, int numberH, string path, int brickWidth, int brickHeight)
    {
      for(int i=0; i < numberH; i++)
      {
        wall.push_back(vector<Brick>());
     
        for(int j=0; j < 1; j++)
        {
          wall.front().push_back
          (
            Brick(path, (brickWidth*j) + (brickWidth/2) , (brickHeight*i) + brickHeight/2, brickWidth, brickHeight)
          );
        }
      }
    }
     
    const vector<vector<Brick> >& Wall::getConstWall() const
    {
      return wall;
    }
    Dans une autre classe je fais un appel à cette méthode pour récupérer un itérateur dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      cout << "==== Debut ===" << endl;
      vector< vector<Brick> >::iterator itV = ((vector< vector<Brick> >)game.getConstBoard().getConstWall().getConstWall()).begin();
      cout << "=== Fin ===" << endl;
    Or j'observe qu'a chaque appel de l'itérateur j'ai de multiples appels aux destructeurs des bricks (J'ai fait un print dans chaque destructeurs):

    Je ne comprend pas pourquoi l'appel à la methode bgin provoque une recopie de mes objets? Je pourrais bien sur initialiser dynamiquement mes Briques mais je me demande si il n'y à pas une autre solution?

    Merci d'avance de vos réponses.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Quand tu fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((vector< vector<Brick> >)game.getConstBoard().getConstWall().getConstWall())
    Tu fais une copie.

    La solution c'est d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    game.getConstBoard().getConstWall().getConstWall()

  3. #3
    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,
    Cet horrible cast pose problème: (vector< vector<Brick> >)

    Je suppose que tu le fait car getConstWall renvoie un vector const, alors que ton iterator est non const.

    Je voie deux bonnes solutions, et une mauvaise:
    - Crée une fonction getWall() qui renvoie un objet non const.
    - Declare vector< vector<Brick> >::const_iterator itV

    Et la mauvaise solution: fait ton cast comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<vector< vector<Brick> >&>(game.getConstBoard().getConstWall().getConstWall())
    Tu ne devrait jamais avoir a faire une chose pareil. C'est comme si le vector te disait:
    - "Ne me touche pas!"
    Et que toi tu lui répondais:
    - "Si!! Hahaha!! Je vais te faire tout ce que j'ai envie!!"

    ... c'est un viol en fait...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Par défaut
    Ok merci de vos réponses le const_iterator fait exactement ce que je veux. Je retourne une constante car je veux éviter, par erreur, de modifier mon double vector en passant par cette méthode.

    Je suis désolé que mon code aie choqué quelqu'un mais je début en C++ et j'ai vraiment du mal à manipuler la STL.

    Merci de votre aide.

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

Discussions similaires

  1. [Débutant] Problème pour recopier mon objet par serialisation
    Par jacko842 dans le forum C#
    Réponses: 1
    Dernier message: 14/05/2015, 23h55
  2. [Framework] Recopie des objets du modèle dans les objets de présentation (command)
    Par Tristan Zwingelstein dans le forum Spring
    Réponses: 0
    Dernier message: 26/03/2013, 16h32
  3. [Windev 12] Recopie objet
    Par jonas0 dans le forum WinDev
    Réponses: 0
    Dernier message: 10/06/2008, 12h38
  4. Recopier un lien Hypertexte d'une cellule vers un objet Shape ?
    Par nicolas_151 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/06/2008, 09h42
  5. Recopier des objets d'un fichier dans un vecteur
    Par dv-2008 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 01/06/2008, 17h22

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