#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 *
(обратите внимание на звездочку). Вы предполагаете — неправильно — что указатели неявно преобразуются в объекты или ссылки, поэтому ваш код заставляет компилятор искать anoperator =()
, который принимает два указателя. Вероятно, вы можете отключить компилятор, выполнив*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, указывает на то, что они не должны указывать. Но, не видя больше кода, трудно дать совет о том, как вам следует удалять указатели из вашего кода.