質問

カスタム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() ':   エラー:型の無効なオペランド    Punto * 'および Punto *'からバイナリ    operator + '

役に立ちましたか?

解決

C / C ++でポインターを減算することはできますが、ポインターを追加することはできないため、最初のものは問題なくコンパイルされます。しかし、いずれにせよ、それはあなたが必要とすることをしません-あなたのオーバーロードされた演算子を使いません。演算子はクラスで定義されているため、ポインターではなくクラスインスタンスを操作する必要があります。そのため、次のように変更します

Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);

もう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を使用するスコープで生きていることを確認してください。

他のヒント

" -"この場合、通常のポインター演算を行い、オーバーロードされた演算子を使用しません。 " + "通常のポインターでは定義されていないため、エラーが発生します。オーバーロードバージョンを使用するには、最初のポインターを逆参照します。

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つのパラメーターが enumまたはクラスタイプ。プリミティブ型に対する演算子のオーバーロードはなく、ポインターはそのようにカウントされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top