Перегруженный оператор присваивания не вызывается - PullRequest
1 голос
/ 02 августа 2010

Я написал перегруженный оператор присваивания класса perform, копируя все значения переменных.Например: в Exp.cpp

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

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

В другом классе output я объявил указатель для abc.

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

Ответы [ 4 ]

9 голосов
/ 02 августа 2010

Предполагая, что abc является объектом Perform, вам нужно разыменовать указатель, который вы присваиваете:

abc = * ptr;

Если abc сам по себе является указателем, то вы не можете делать то, что просите - вы можетеt назначение перегрузки, где LHS является указателем.Вы должны разыменовать оба указателя:

* abc = * ptr;
0 голосов
/ 02 августа 2010

В примере кода вы присваиваете указатели, поэтому нет никакой возможности вызвать оператор присваивания без разыменования указателя.

И при таком дизайне риск выполнения мелкого копирования огромен.Кроме того, сигнатура оператора присваивания C ++ выглядит так: «execute & operator = (...)», как указано в стандарте.Он должен возвращать ссылку на тот же объект, чтобы компилятор мог рассмотреть его так, как вы ожидаете.

подробнее об операторе присваивания ... .

0 голосов
/ 02 августа 2010
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 голосов
/ 02 августа 2010

Кроме того, безопаснее возвращаться по ссылке, что позволяет избежать вызова конструктора копирования.

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

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