4

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

ただし、2 つのポインターを取り、それらを適切な方法で追加するフリー関数のオーバーロードは機能operator+しません。これは、パラメーターの少なくとも 1 つが列挙型またはクラス型である必要があるためです。プリミティブ型の演算子のオーバーロードはなく、ポインターはそのようにカウントされます。

于 2009-06-17T03:38:23.837 に答える