我需要帮助才能使用自定义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 +'
答案 0 :(得分:5)
第一个编译很好,因为你可以减去C / C ++中的指针,但不能添加指针。但无论如何它并不能满足您的需求 - 它不会使用您的重载运算符。由于您的运算符是在类中定义的,因此您需要对类实例进行操作,而不是对指针进行操作。所以,改成像
这样的东西Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);
另一件事 - 您应该在运算符定义中使用类引用,而不是值。 E.g。
Punto& operator+(const Punto& p) {
EDIT。要简化代码,您可以创建一个访问器函数,如下所示:
const Punto& NodoRef(int i, int j) {
return *(fem->elementoFronteria[i]->Nodo[j]);
}
然后你的代码变得像
一样干净p = NodoRef(i,0) + NodoRef(i,1);
NodoRef可能在您的女性课程中或外部定义。只需确保对象fem在您使用NodoRef的范围内存活。
答案 1 :(得分: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 or class type。原始类型没有运算符重载,指针也是如此。