自定义C++类上的错误

Lui*_*nes 4 c++ compiler-construction overloading operator-overloading

我需要帮助找到问题,使用自定义c ++类来管理3D位置.这是该课程的相关代码

  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;
  }
Run Code Online (Sandbox Code Playgroud)

我在这里使用它是这样的:

p = fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
Run Code Online (Sandbox Code Playgroud)

nodo [i]是Punto*,编译得很好,但是当我尝试做的时候:

p = fem->elementoFrontera[i]->nodo[0] + fem->elementoFrontera[i]->nodo[1];
Run Code Online (Sandbox Code Playgroud)

编译器说:

在成员函数void mdTOT::pintarElementosFrontera()': error: invalid operands of types Punto*'和Punto*' to binary operator +'中

Igo*_*kon 5

第一个编译好,因为你可以减去C/C++中的指针,但不能添加指针.但无论如何它并不能满足您的需求 - 它不会使用您的重载运算符.由于您的运算符是在类中定义的,因此您需要对类实例进行操作,而不是对指针进行操作.所以,换成类似的东西

Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);
Run Code Online (Sandbox Code Playgroud)

另一件事 - 您应该在运算符定义中使用类引用,而不是值.例如

 Punto& operator+(const Punto& p) {
Run Code Online (Sandbox Code Playgroud)

编辑.要简化代码,您可以创建一个访问器函数,如下所示:

const Punto& NodoRef(int i, int j) {
  return *(fem->elementoFronteria[i]->Nodo[j]);
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码变得干净利落

p = NodoRef(i,0) + NodoRef(i,1);
Run Code Online (Sandbox Code Playgroud)

NodoRef可以在您的女性班级或外部定义.只需确保对象fem在您使用NodoRef的范围内存活.