문제

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+ 매개 변수 중 하나 이상이 열거 또는 클래스 유형. 원시 유형에 대한 연산자 과부하는 없으며 포인터는 그와 같이 계산됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top