代码之家  ›  专栏  ›  技术社区  ›  Luis Yanes

自定义C++类上的Bug

  •  4
  • Luis Yanes  · 技术社区  · 17 年前

      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

    2 回复  |  直到 11 年前
        1
  •  5
  •   J.J.    17 年前

    第一个编译得很好,因为你可以在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在使用NodoRef的范围内是活动的。

        2
  •  0
  •   sth    17 年前

    第一个版本之所以有效,是因为“ - “在这种情况下,它执行正常的指针运算,不使用任何重载运算符。” +

    p = *fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
    

    Punto operator+(const Punto &p){
       ...
    }
    

    这样,每次使用时都不会复制对象”

    基本上,你想做这样的事情:

    const Punto operator+(Punto *left, Punto *right); // not allowed
    

    但是重载一个自由函数 operator+ 接受两个指针并以适当的方式添加它们是不起作用的,因为至少有一个参数需要是 enum or class type 。基本类型没有运算符重载,指针也按原样计数。