私はマット操作*のオーバーロード(左右両方)
class Mat
{
..
..
..
friend Mat& operator*(Mat s1,int elem){
s1.multiWith(elem);
return s1;
}
};
が、今では M1 * 2 のために動作しますが、それは 2 * M1
私はマット操作*のオーバーロード(左右両方)
class Mat
{
..
..
..
friend Mat& operator*(Mat s1,int elem){
s1.multiWith(elem);
return s1;
}
};
が、今では M1 * 2 のために動作しますが、それは 2 * M1
a*b
演算子は、a
への参照ではなく、新しいオブジェクトを返すことになっています。クラス内operator*
を宣言する
正しい構文は次のとおりです
class Mat
{
..
..
..
Mat operator*(int elem){
Mat res = *this;
res.multiWith(elem);
return res;
}
};
そして、左側のパラメータのタイプは、(ここで:a*b
の左側のパラメータが必ずしもMat
インスタンスである)は、必ずしも現在のクラスです。
今、あなたはクラスの外の演算子を宣言した場合、あなたは左と右のパラメータのいずれかのタイプを自由に選択できます:
class Mat
{
};
Mat operator*(const Mat& left,int right){
Mat res;
// do res=left*elem
return res;
}
Mat operator*(int left,const Mat& right){
Mat res;
// do res=left*right
return res;
}
今では、M1の* 2のために動作しますが、それを動作させる方法2 * m1の場合
別のオーバーロードを提供します。
class Mat
{
..
friend Mat operator*(const Mat& s1, int elem) {
Mat ret = s1;
ret.multiWith(elem);
return ret;
}
friend Mat operator*(int elem, const Mat& s1) {
return s1 * elem;
}
};
BTW1:operator*
がない参照することにより、値によってMat
を返すべきです。
BTW2:コピーすることを避けるために、s1
のパラメータタイプをconst参照に変更することができます。
BTW3:Mat::multiWith
がprivate
operator*
でない場合、friend
である必要はありません。
それはうまくいくように見えますが、私はいつ家に帰るでしょう。 – JohnnyF
とMatがTemplateの場合はどうすればよいのですか? – JohnnyF
@ JohnnyF:あなたはOPに言及していないので、それはおそらく別の質問になるはずです。しかし、演算子宣言の前に 'template <...>'を追加するだけです。外部的にクラスに宣言された操作は、テンプレートにすることができます。 – jpo38
@downvoter、詳細を教えてください... – jpo38