c++ - 自定义 C++ 类上的错误

标签 c++ compiler-construction operator-overloading 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;
  }

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

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];

编译器说:

In member function void mdTOT::pintarElementosFrontera()': error: invalid operands of types Punto*' and Punto*' to binary operator+'

最佳答案

第一个编译良好,因为您可以在 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 的范围内有效。

关于c++ - 自定义 C++ 类上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1004961/

相关文章:

用于模板重载的 C++ 模糊运算符

c++ - 如何将字符串转换为 ifstream

c++ - 显式调用括号前的表达式必须具有(指向)函数类型

c++ - For 循环不停止

c++ - 使用 android ndk 将 java Hashmap<Mat, bool> 转换为 c++ std::map<Mat, bool>

c++运算符重载,析构函数被调用

language-agnostic - 是否有任何 self 改进的编译器?

c++ - 编译器是否可以在仅引用一次时隐式 std::move 参数?

javascript - 从闭包编译器重建代码

C#后缀和前缀递增/递减重载区别