C++复制构造函数、赋值'operator='

C++ copy constructor, assignment 'operator='

本文关键字:operator 赋值 复制 构造函数 C++      更新时间:2023-10-16

我正在尝试创建一个复制构造函数或=操作符。如果我定义一个名为a的矩阵,另一个为B和C,并使用'='运算符作为:

= B

表现很好,但是如果我使用

A = B + C我得到这个错误:没有匹配'='的函数。

关键是当我将符号(=)更改为(==)时,它工作得很好,即使在A == B+C的情况下,但是仅使用等号(=)它不起作用!什么好主意吗?

头文件:

Simple2DMatrixD (const Simple2DMatrixD& matrixA)
{
   numRows = matrixA.numRows;
   numCols = matrixA.numCols;
   dataArray = new double[numRows * numCols];
   for (int iX = 0; iX < numRows; iX++)
   {
       for (int iY = 0; iY < numCols; iY++)
       {
           dataArray[(iX * numRows) + iY] = matrixA.getElement(iX,iY) ;
       }
   }
}

Simple2DMatrixD & assign (const Simple2DMatrixD & matrixB);
Simple2DMatrixD & sum (const Simple2DMatrixD & matrixA, const Simple2DMatrixD & matrixB);

//加法运算符

friend Simple2DMatrixD operator+ (Simple2DMatrixD & matrixA, Simple2DMatrixD & matrixB)
{
    Simple2DMatrixD matrixTemp(matrixA.numRows, matrixA.numCols);
    matrixTemp.sum(matrixA, matrixB);
    return (matrixTemp);
}

//操作符

Simple2DMatrixD & operator= (const Simple2DMatrixD & matrixB)
{
    this->assign(matrixB);
    return (*this);
}

//在源文件中:

Simple2DMatrixD & Simple2DMatrixD::assign (const Simple2DMatrixD & matrixB)
{
for (int r = 0; r < numRows; r++)
{
    for (int c = 0; c < numCols; c++)
    {
        this->setElement(r, c, matrixB.getElement(r, c));
    }
}
return (*this);
}

Simple2DMatrixD & Simple2DMatrixD::sum (const Simple2DMatrixD & matrixA, const Simple2DMatrixD &         
matrixB)
{
// TODO REPLACE WITH COMPAREDIMENSION FUNCTION
if ((this->numRows == matrixB.numRows)
    && (this->numCols == matrixB.numCols)
    )
{
    for (int r = 0; r < matrixA.numRows; r++)
    {
        for (int c = 0; c < matrixA.numCols; c++)
        {
            this->setElement(r, c, matrixA.getElement(r, c) + matrixB.getElement(r, c));
        }
    }
    return (*this);
}
else
{
    throw " Dimensions does not match!";
}
}

您正在滥用friend说明符。您要么必须在类的定义之外声明operator+,像这样:

inline Simple2DMatrixD operator+(Simple2DMatrixD & matrixA, Simple2DMatrixD & matrixB)
{
  Simple2DMatrixD matrixTemp(matrixA.numRows, matrixA.numCols);
  matrixTemp.sum(matrixA, matrixB);
  return (matrixTemp);
}

并在Simple2DMatrixD类中声明为友元:

class Simple2DMatrixD {
  friend Simple2DMatrixD operator+ (Simple2DMatrixD & matrixA, Simple2DMatrixD & matrixB);
  ...
};

或者你可以在类的定义中声明它,像这样:

class Simple2DMatrixD {
  ...
  Simple2DMatrixD operator+(Simple2DMatrixD const &rhs)
  {
    Simple2DMatrixD matrixTemp(rhs.numRows, rhs.numCols);
    matrixTemp.sum(*this, rhs);
    return (matrixTemp);
  }
  ...
};

friend外部类的定义是无效的说明符。

我的直觉告诉我,你的const正确性是错误的地方。请发布完整的错误信息。

声明不改变对象的成员函数为const

struct A
{
  float retunrsSomethingButDoesNotChangesA()const; // <- note the const
};
// in cpp:
float A::retunrsSomethingButDoesNotChangesA()const // <- note the const
{
  return 5.5f;
}
如果函数不更改,则将函数的引用参数设为const