사용자 정의 C ++ 클래스의 버그
-
05-07-2019 - |
문제
3D 위치를 관리하기 위해 사용자 정의 C ++ 클래스를 사용하여 문제를 찾는 데 도움이 필요합니다. 다음은 수업의 관련 코드입니다
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]가 푼토*이고 잘 컴파일하지만 내가하려고 할 때 :
p = fem->elementoFrontera[i]->nodo[0] + fem->elementoFrontera[i]->nodo[1];
컴파일러는 말한다 :
회원 기능에서
void mdTOT::pintarElementosFrontera()': error: invalid operands of types
Punto*'및Punto*' to binary
연산자+'
해결책
첫 번째는 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를 사용하는 범위에서 객체 FEM이 살아 있는지 확인하십시오.
다른 팁
첫 번째 버전은 "-
"이 경우 일반적인 포인터 산술이 있으므로 과부하 된 연산자를 사용하지 않습니다."+
"일반 포인터에 정의되지 않으므로 오류가 발생합니다. 과부하 된 버전을 사용하려면 첫 번째 포인터를 한 번 언급하십시오.
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+
매개 변수 중 하나 이상이 열거 또는 클래스 유형. 원시 유형에 대한 연산자 과부하는 없으며 포인터는 그와 같이 계산됩니다.