перегруженное "=" равенство не вызывается при создании obj2 = obj1 - PullRequest
0 голосов
/ 11 августа 2009

У меня есть этот класс под названием MemoryManager,

предполагается реализовать простой умный указатель, (ссылка на счет);
у меня есть вектор, в котором я храню запрошенные указатели, и я возвращаю индекс указателя вызывающей стороне ..

когда пользователь создает указатель типа MemoryManager, он вызывает функцию инициализатора под названиемified_malloc (size_t), создает объект MemoryManager, выделяет пространство памяти и сохраняет его в данных, увеличивает число и сохраняет объект в global_MM_vecotr и возвращает индекс в качестве указателя, когда использование пытается использовать косвенное обращение (->), я возвращаю соответствующий реальный указатель из вектора, в соответствии со значением индекса ..

class MemoryManager
{
public:
    //operators overloading prototypes

private:
    void*  data;
    int count ;
};

 std::vector<MemoryManager*> global_MM_vecotr; 
  void* MemoryManager::operator=( void* x)
 {
   // some code here
 }

Проблема, с которой я сталкиваюсь, заключается в том, что я перегружал пару операторов, однако, когда я пытаюсь запустить код ниже, оператор "=" не вызывается .. Может кто-нибудь указать мне на проблему ...

  //the main code 
 {

MemoryManager* obj1 = (MemoryManager*) x->fun1(4); //fun1 returns an index to a MemoryManager obj in a vector;
MemoryManager* obj2 =  obj1 ;
   }

Редактировать: уже пробовал следующее, без изменений

  {  
        MemoryManager*obj1 = (MemoryManager*) x->fun1(4); //fun1 returns an index to a Class obj in a vector;
MemoryManager*obj2 ;
*obj2 =  *obj1;
  }


 {
     MemoryManager* obj1  = ( MemoryManager*) x-> fun1(4);
MemoryManager* obj2;
obj2.operator =(*obj1);
}

Ответы [ 4 ]

9 голосов
/ 11 августа 2009

Исходя из вашего кода, вы определили operator= для класса MemoryManager, взяв void*.

Ваш пример кода инициализирует ClassA указателей и не назначает MemoryManager экземпляров.

Есть три причины, по которым ваш код не вызывается.

  • Вы инициализируете не присваивание, поэтому, если что-то будет вызываться конструктор, а не оператор присваивания.
  • Вы инициализируете указатели, а не объекты, указатели являются базовыми типами, и вы не можете предоставить перегруженные операторы для них.
  • Вы используете ClassA, а не MemoryManager, для которого вы фактически предоставили operator=.
4 голосов
/ 11 августа 2009

См. Спецификации, вы не можете переопределить основные операции указателя.

2 голосов
/ 11 августа 2009

Может показаться техническим, но вы не присваиваете ClassA, вы присваиваете ClassA* (то есть указатель). Я мог бы быть далеко отсюда, но я бы возложил вину на это.

1 голос
/ 11 августа 2009

Я подозреваю, что вы используете пустой указатель, чтобы вы могли вводить любые объекты. Я бы рекомендовал использовать шаблон вместо этого в сочетании с boost :: check library .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...