égalité des pointeurs

égalité des pointeurs - C++ - Programmation

Marsh Posté le 20-04-2013 à 12:16:37    

Bonjour,
 
Si j'ai une classe mère C qui possède un attribut pointeur vers une classe A. La classe C a deux classes filles C1 et C2 et aussi la classe A a deux classe filles A1 et A2

Code :
  1. class C
  2. {
  3. A* attr1;
  4. A* attr2;
  5. C(A,A);
  6. ~();
  7. }


C.cpp

Code :
  1. C::C(A var)
  2. {this->attr1=new C(var1);
  3. C::~C(){delete attr1;
  4. delete attr2;}


class C1

Code :
  1. class C1
  2. {
  3. C1(A1 a1)
  4. {this->attr1=new A1(a1);   }
  5. }


Dans le main:
 
A1 a1("rr",2);
C1 c1(a1);
C2 c2(a1);
 
le test d'egalité suivant c1.attr1=c2.attr1 est négatif. En fait,  c1.attr1 et c2.attr1 n'ont pas la meme adresse mémoire donc ils ne sont pas égaux.  
 
Comment corriger mon code pour que c1.a1 et C2.a2 pointent sur la meme instance a1?
Merci d'avance.

Reply

Marsh Posté le 20-04-2013 à 12:16:37   

Reply

Marsh Posté le 20-04-2013 à 17:49:15    

Reply

Marsh Posté le 21-04-2013 à 10:00:25    

Citation :

Comment corriger mon code pour que c1.a1 et C2.a2 pointent sur la meme instance a1?

En réfléchissant à ce que fait new dans la ligne this->attr1=new A1(a1);
Alors que manifestement, c'est quelque chose de la forme this->attr1 = &a1; que vous désirez faire.
 
A+,


Message édité par gilou le 21-04-2013 à 10:11:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-04-2013 à 16:44:31    

De toute façon vu ton code, s'ils sont égaux tu aura un beau crash.
Puisque ton desctructeur ~C delete attr1 et attr2.
D'ailleurs attr2 n'est pas non plus initialisé à NULL, tu vas donc faire du jardinage en mémoire.
 
En fait ton code me semble bourré d'erreurs qui le rendent difficile à suivre.
 
genre

Code :
  1. C::C(A var)
  2. {this->attr1=new C(var1);
  3. }


 
je suppose que tu veux dire

Code :
  1. C::C(A var)
  2. {this->attr1=new A(var);
  3. ...
  4. }


mais du coup rien d'étonnant si C1.attr1 est != de C2.attr1 puisque tu affectes en fait des copies de a1 et pas a1 lui même, et en plus tu passes par valeur donc des copies et pas ton pointeur !!
 
Toutefois si tu veux partager le pointeur il faut alors ne plus le libérer dans ton destructeur (sinon crash) mais le gérer à l'extérieur de ta classe C.
Une autre solution envisageable serait d'utiliser un smart pointeur
 
Une correction possible (mais attention, je ne suis pas sur que ça soit une bonne idée, dépend du contexte)

Code :
  1. C::C(A *pvar)
  2. {
  3.      attr1= pvar;
  4.      attr2 = NULL;
  5. }
  6. C::~C()
  7. {
  8. //delete attr1; // non car ton instance est partagée !
  9. //delete attr2; // ? peut etre non plus si tu fonctionne comme pour attr1
  10. }


Message édité par Malkav le 26-04-2013 à 16:49:10

---------------
Mes feedbacks * Ma galerie photo
Reply

Marsh Posté le 26-04-2013 à 20:13:31    

Exactement, c que je voudrais avoir. En fait, mon but est le partager d'un objet de type C1.
Cette méthode :

Citation :

   C::C(A *pvar)
    {
         attr1= pvar;
         attr2 = NULL;
    }
    C::~C()
    {
    //delete attr1; // non car ton instance est partagée !
    //delete attr2; // ? peut etre non plus si tu fonctionne comme pour attr1
    }


 
lève l'exception suivante : Debug Assertion failed Block_type_IS_VALID(p_Head_nBlockUse)

Reply

Sujets relatifs:

Leave a Replay

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