2016-05-29 45 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

以及如果墊子是模板......我怎麼能寫出我的班級操作員? – 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更改爲常量引用以避免複製。
BTW3:如果Mat::multiWith不是privateoperator*不必是friend

+0

看起來好像會起作用,V會檢查我什麼時候回家,ty – JohnnyF