2016-05-29 7 views

答えて

3
で動作させるためにどのようにクラスを持っています

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; 
} 
+0

とMatがTemplateの場合はどうすればよいのですか? – JohnnyF

+0

@ JohnnyF:あなたはOPに言及していないので、それはおそらく別の質問になるはずです。しかし、演算子宣言の前に 'template <...>'を追加するだけです。外部的にクラスに宣言された操作は、テンプレートにすることができます。 – jpo38

+0

@downvoter、詳細を教えてください... – jpo38

1

今では、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::multiWithprivateoperator*でない場合、friendである必要はありません。

+0

それはうまくいくように見えますが、私はいつ家に帰るでしょう。 – JohnnyF

関連する問題