カスタムC ++クラスのバグ
-
05-07-2019 - |
質問
カスタム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またはクラスタイプ。プリミティブ型に対する演算子のオーバーロードはなく、ポインターはそのようにカウントされます。