我有一個類地墊操作超載*(包括左側和右側)
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
更改爲常量引用以避免複製。
BTW3:如果Mat::multiWith
不是private
operator*
不必是friend
。
看起來好像會起作用,V會檢查我什麼時候回家,ty – JohnnyF
以及如果墊子是模板......我怎麼能寫出我的班級操作員? – JohnnyF
@JohnnyF:這可能應該是一個單獨的問題,因爲你沒有提到OP。但是,在操作員聲明之前,只需添加'template <...>'。從外部聲明到類的操作可以是模板。 – jpo38
@downvoter,請詳細說明...... – jpo38