Вопрос

Мне нужна помощь в поиске проблемы с использованием пользовательского класса 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 или тип класса . Для примитивных типов перегрузка операторов отсутствует, и указатели учитываются как таковые.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top