簡體   English   中英

無法從重載運算符傳遞值

[英]Cannot pass value from overloaded operator

正如主題中所述,我遇到了將值從重載運算符傳遞回main函數的問題。 我已經搜索了很多但沒有效果。 這是我的示例運算符。 返回之前的線矩陣mi已經讓cout檢查算法是否正常工作。 乘法運算符我遇到了同樣的問題。

matrix.h

class Matrix 
{
public:
...
Matrix &operator+(const Matrix &m)
... 

private:
    int x;
    int y;
    double **tab;

};

matrix.cpp

Matrix &Matrix::operator+(const Matrix &m)
{
if(x==m.x && y==m.y)
{
    Matrix temp(x,y);
    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)
        {
            temp.tab[i][j]=tab[i][j]+m.tab[i][j];
        }
    }
    cout << temp<< endl;
return temp;
}
else
{
    char er[]={"error!\n"};
    throw er;
}

}

基本問題是加法運算符不應返回引用,而是返回值:

Matrix operator+(const Matrix &m);

這適用於乘法,減法等。

除了返回對僅存在於函數范圍內的變量的引用這一事實之外,返回引用在語義上沒有意義。 想想這個表達式:

B + C;

如果要返回引用,它應該引用什么?

一種常見的方法是將Matrix& operator+=(const Matrix&)為成員運算符,然后將其作為非成員實現:

Matrix operator+(Matrix lhs, const Matrix& rhs)
{
  return lhs += rhs;
}

這使得操作對稱WRT LHS和RHS,允許雙方的隱式轉換。

簡單回答:永遠不會返回對您在函數中創建的對象的引用。 這意味着,您的操作員應該返回一個Matrix ,而不是一個Matrix&&屬於返回類型,您可能希望將其放在那里以使其更明顯)。

如果為Matrix類提供適當的移動構造函數,則返回結果時不會有昂貴的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM