Вопрос о перегрузке operator = в c

#c

#c

Вопрос:

После того, как я перегрузил operator =:

 Object1amp; operator =(Object2* r) 
{
        ObjVector.push_back(r);
        return *this;
};
 

и вызовите его в функции-члене другого класса, он выдает ошибку, подобную этой:

ошибка: недопустимые операнды типа ‘object *’ и ‘object *’ в двоичный ‘operator ‘

Obj1 = Obj2;

ошибка: при вычислении ‘operator = (объект class1 *, объект class2 *)

Почему он вызывает ‘operator ‘ вместо ‘operator =’?

Комментарии:

1. Ваш operator = используется только в том случае, когда Obj1 имеет тип (или ссылку на) Object1 . В сообщении об ошибке указывается, что Obj1 это тип Object1 * (обратите внимание на звездочку). Вы предполагаете — неправильно — что указатели неявно преобразуются в объекты или ссылки, поэтому ваш код заставляет компилятор искать an operator =() , который принимает два указателя. Вероятно, вы можете отключить компилятор, выполнив *Obj1 = Obj2 . В зависимости от того, на что Obj1 на самом деле указывает (вы не указали), результат будет либо четко определенным (если он указывает на допустимый объект), либо неопределенным.

Ответ №1:

Поскольку ваш параметр для оператора является указателем, это, вероятно, порадует компилятор:

 Obj1  = amp;Obj2;
 

Или, если они являются указателями, то это;

 *Obj1  = Obj2;
 

Я обычно не рекомендую перегружать операторы математическими операторами, если только не задействована фактическая математика (например, класс комплексных чисел). В вашем случае вы добавляете ссылку на указатель к вектору-члену. Учтите тот факт, что std::vector сам по себе он также не имеет перегруженного оператора. Ваша операция создает ссылку между Object1 и Object2 вместо копии. Я бы порекомендовал вам просто вызвать метод AppendObject :

 Object1 AppendObject(Object2* r) 
{
     ObjVector.push_back(r);
     return *this;
};
 

А затем вызвать его явно:

 Obj1.AppendObject(amp;Obj2);
 

Комментарии:

1. Жаль, что в C нет оператора конкатенации , учитывая, что он рекомендуется (вами, мной и многими другими) для использования в математическом смысле. (Игнорируя Boost Spirit, для одноразового использования.) И другие языки, в которых они есть, имеют довольно широкий набор используемых символов оператора. Нет убедительного консенсуса. 🙁

Ответ №2:

Предположительно Obj1 , и Obj2 являются указателями. Измените на это

 *Obj1  = *Obj2;
 

и ваша перегрузка к этому

 Object1amp; operator =(const Object2amp; r) 
 

Вероятно, еще лучше было бы вообще не использовать указатели. Новички слишком часто используют указатели. Сам факт, что ваши переменные называются object 1 и object 2, указывает на то, что они не должны указывать. Но, не видя больше кода, трудно дать совет о том, как вам следует удалять указатели из вашего кода.