4

我需要帮助来使用自定义 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;
  }

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

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*' 和Punto*' to binary operator+'

4

2 回答 2

5

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

于 2009-06-17T03:32:37.327 回答
0

第一个版本之所以有效,是因为 " -" 在这种情况下执行正常的指针运算,它不使用任何重载运算符。" +" 没有在普通指针上定义,所以你会得到一个错误。要使其使用重载版本,请取消引用第一个指针:

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 或 class 类型。基本类型没有运算符重载,指针也一样。

于 2009-06-17T03:38:23.837 回答