[Qt] Manipulation de QVector

Manipulation de QVector [Qt] - C++ - Programmation

Marsh Posté le 18-02-2010 à 10:47:32    

Premièrement Bonjour :D,
 
Mon problème d'aujourd'hui est le suivant :
 
J'ai une classe A dans la quelle j'ai un QVector d'entier en private,
 ainsi qu'une méthode qui retourne ce vector,
 une autre qui permet d'insérer une valeur à la fin du vector.  
Ces deux méthodes sont déclaré en public toujours dans ma classe A.
 
Lorsque dans mon main je crée un objet a de la classe A et que j'utilise les deux méthodes sus-nommé mon vector voit ça taille varier de manière "définitive".
 
Le problème est lorsque je crée un objet, a, de la classe A, en private, dans une classe B qui possède une méthode retournant l'objet a et que dans mon main je crée un objet, b, de la classe B et que je souhaite modifier insérer une nouvelle valeur à l'objet a ça fonctionne uniquement le temps de la méthode d'insertion, car à la sortie de cette méthode il appel les destructeur et remets le vector contenue dans l'objet a à la taille qu'il avait à la sortie du constructeurs de b.
 
J'essaye de comprendre pourquoi depuis hier et je ne vois pas le pourquoi ni une solution possible c'est pour quoi je me tourne vers vous.
 
Ne sachant si mes explications sont clairs voici le code :
 
A.cpp

Code :
  1. #include<QVector>
  2. class A
  3. {
  4. public:
  5.     A();
  6.     ~A();
  7.     QVector<int> getVect(){return vect;}
  8.     void addVect(int i){vect.append(i);}
  9. private:
  10.     QVector<int> vect;
  11. };
  12. A::A()
  13. {
  14.     this->vect.prepend(0);
  15. }
  16. A::~A()
  17. {
  18.     this->vect.clear();
  19. }


B.cpp

Code :
  1. #include "A.h"
  2. class B
  3. {
  4.     public:
  5.     B();
  6.     A getaB(){return aB;}
  7.     private:
  8.     A aB;
  9. };
  10. B::B()
  11. {}


 
main.cpp

Code :
  1. #include <QDebug>
  2. #include "B.cpp"
  3. int main ()
  4. {
  5.     qDebug("Test avec A directement :" );
  6.     A a=A();
  7.     qDebug()<<a.getVect().size();
  8.     a.addVect(5);
  9.     qDebug()<<a.getVect().size();
  10.     qDebug("--------------------------------------------" );
  11.     qDebug("Test avec B :" );
  12.     B b;
  13.     qDebug()<<"taille avant l'appel de B::geta()::manipQcect::addvect() :"<<b.getaB().getVect().size();
  14.     b.getaB().addVect(42);
  15.     qDebug()<<b.getaB().getVect().size();
  16.     return 0;
  17. }


 
Voici la sortie :

Citation :

Test avec A directement :
1  
2  
--------------------------------------------
Test avec B :
taille avant l'appel de B::geta()::manipQcect::addvect() : 1  
1

Reply

Marsh Posté le 18-02-2010 à 10:47:32   

Reply

Marsh Posté le 18-02-2010 à 11:19:09    

En bidouillant j'ai finis par trouver une solution :
 
Implémenter une méthode addVect(int) dans la classe B qui va appeler la méthode addVect(int) de la classe A sur l'objet aB.
 
J'ai eu l'idée en écrivant le sujet ^^"

Reply

Marsh Posté le 18-02-2010 à 11:41:48    

Tu peux aussi renvoyer des références, au lieu de renvoyer des copies :
Dans A : QVector<int>& getVect();
Dans B : A& getaB();


---------------
Be the one with the flames.
Reply

Marsh Posté le 18-02-2010 à 14:42:31    

quel est l'avantage et l'inconvénient de l'un par rapport à l'autre ?

Reply

Marsh Posté le 18-02-2010 à 15:19:17    

Tu peux modifier l'objet qui t'es retourné, c'est-à-dire que le main que tu as posté plus haut aurait le comportement que tu voulais.


---------------
Be the one with the flames.
Reply

Marsh Posté le 18-02-2010 à 16:00:42    

Ok, merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed