2010-08-02 6 views
1

J'ai écrit un opérateur d'affectation surchargé de classe perform en copiant toutes les valeurs de variables. Ex: dans Exp.cppL'opérateur d'assignation surchargé n'est pas appelé

class perform 
{ 
    LOG *ptr; 
int a; 
//constructor 
//destructor 
perform operator=(const perform & rhs){ 

    ptr = rhs.ptr; a=rhs.s; 
return * this;} 
}; 

Dans une autre classe output, j'ai déclaré un pointeur pour abc.

perform * ptr = StatCol::CreateCol(frm); 
abc = ptr; //this line should invoke assignment overloaded. 
      //but in my case it's not invoked. 
+0

Montrez-nous votre code actuel, y compris la déclaration de 'abc'. Il est difficile de savoir quelle est l'erreur à l'origine de votre problème et quelle erreur vous avez faite en retapant votre code ici. – dave4420

+0

le code est tellement énorme. Ou bien vous me posez les questions liées.je dirai lié à mon problème.Voici abc est un pointeur de type Perform.Wehter LHS peut être pointeur? – Vishu

+0

J'ai besoin d'une copie profonde. – Vishu

Répondre

9

En supposant abc est un objet Exécuter, vous devez déréférencer le pointeur vous assignez:

abc = * ptr; 

Si abc est lui-même un pointeur, alors vous ne pouvez pas faire ce que vous demandez - vous ne peut pas surcharger l'affectation lorsque le LHS est un pointeur. Vous devez déréférencer les pointeurs:

* abc = * ptr; 
+0

oui, vous êtes rite, abc est un pointeur. – Vishu

+0

dans ce cas quoi faire? – Vishu

+0

@Vishu Faites ce que j'ai dit - déréférencer les deux pointeurs - cela utilisera votre opérateur d'affectation. –

0

En outre, il est plus sûr de revenir par référence évitant ainsi un constructeur de copie appelée.

const perform& operator=(const perform & rhs){ 

    if (this != &rhs) 
    { 
     ptr = rhs.ptr; a=rhs.s; 
    } 
    return * this; 
    } 
+0

oui j'ai écrit la même chose comme aobve., Mais il n'est pas appelé LHS est un pointer.ie abc est un pointeur – Vishu

0
Custom assignment operator works only with user defined types so do like this: 

perform p1,p2; 
p1 = p2; 
perform *p = &p2; 
p1 = *p; 


You can't override assignment of built in types(int , char etc.). 

perform *p1,*p2; 
p1 = p2; 

It simply copies the address of p2 to p1. 
0

Dans l'exemple de code que vous assignez des pointeurs, donc il n'y a aucune chance que vous pourriez jamais appeler l'opérateur d'affectation sans déréférencer le pointeur.

Et en utilisant cette conception, le risque de faire des copies superficielles est énorme. De plus, la signature de l'opérateur d'affectation C++ est: 'Effectuer & operator = (...)' comme indiqué dans la norme. Il doit renvoyer une référence au même objet pour que le compilateur le considère comme prévu.

more about assignment operator....

+0

La norme n'a pas d'exigence sur le type de retour, qui ne prend jamais part à surcharge. –