Ошибка в пользовательском классе C ++
-
05-07-2019 - |
Вопрос
Мне нужна помощь в поиске проблемы с использованием пользовательского класса c ++ для управления трехмерными позициями.Вот соответствующий код из класса
Punto operator+(Punto p){
return Punto(this->x + p.x, this->y + p.y, this->z + p.z);
}
Punto operator+(Punto *p){
return Punto(this->x + p->x, this->y + p->y, this->z + p->z);
}
Punto operator-(Punto p){
return Punto(this->x - p.x, this->y - p.y, this->z - p.z);
}
Punto operator-(Punto *p){
return Punto(this->x - p->x, this->y - p->y, this->z - p->z);
}
Punto *operator=(Punto p){
this->x = p.x;
this->y = p.y;
this->z = p.z;
return this;
}
Punto *operator=(Punto *p){
this->x = p->x;
this->y = p->y;
this->z = p->z;
return this;
}
Я использую это здесь следующим образом:
p = fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
Где nodo[i] - это Punto *, и он отлично компилируется, но когда я пытаюсь сделать:
p = fem->elementoFrontera[i]->nodo[0] + fem->elementoFrontera[i]->nodo[1];
Компилятор говорит:
В функции-члене
void mdTOT::pintarElementosFrontera()': error: invalid operands of types
Пунто*' иPunto*' to binary
оператор+'
Решение
Первый компилируется нормально, потому что вы можете вычитать указатели в C / C ++, но не добавлять указатели.Но в любом случае он не делает того, что вам нужно - он не использует ваш перегруженный оператор.Поскольку ваши операторы определены в классе, вам нужно оперировать экземплярами класса, а не указателями.Итак, измените на что-то вроде
Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);
Другое дело - вы должны использовать ссылки на классы, а не значения, в определении оператора.Например.
Punto& operator+(const Punto& p) {
Редактировать.Чтобы упростить код, вы можете создать функцию доступа, например, так:
const Punto& NodoRef(int i, int j) {
return *(fem->elementoFronteria[i]->Nodo[j]);
}
и тогда ваш код становится таким же чистым, как
p = NodoRef(i,0) + NodoRef(i,1);
NodoRef может быть определен в вашем классе fem или за его пределами.Просто убедитесь, что объект fem активен в области, в которой вы используете NodoRef.
Другие советы
Первая версия работает, потому что " -
" в этом случае выполняет обычную арифметику указателей, она не использует ни один из ваших перегруженных операторов. & Quot; <код> + код> & Quot; не определяется на обычных указателях, поэтому вы получаете ошибку. Чтобы использовать перегруженную версию, разыменуйте первый указатель:
p = *fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
Разыменование обоих указателей также должно работать, так как у вас есть оба типа перегрузок, но вы должны изменить определения операторов, чтобы использовать ссылки const в этом случае:
Punto operator+(const Punto &p){
...
}
Таким образом, объекты не копируются каждый раз, когда вы используете " +
".
По сути, вы хотите сделать что-то вроде этого:
const Punto operator+(Punto *left, Punto *right); // not allowed
Но перегрузка свободной функции operator +
, которая берет два указателя и добавляет их подходящим способом, не работает, поскольку хотя бы один из параметров должен иметь enum или тип класса . Для примитивных типов перегрузка операторов отсутствует, и указатели учитываются как таковые.