【发布时间】:2014-05-13 09:35:18
【问题描述】:
我正在尝试创建一个复制构造函数或 = 运算符。 如果我定义一个名为 A 的矩阵,另一个为 B 和 C 并使用 '=' 运算符:
A=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!";
}
}
【问题讨论】:
-
将加法运算符更改为采用
const引用。另外,显示真实代码。特别是,成员在哪里定义(在类定义中内联或单独在实现文件中?) -
你能把它简化为一个完整的、最小的测试用例来证明错误吗?当我尝试将你的片段拼接成可编译的东西时,我无法重现它。
-
friend在定义operator+之前做了什么? -
@40two 最有可能将加法运算符声明为朋友。
-
@40two: 声明它是类的朋友,这样它就可以访问私有成员而不是成员。
标签: c++ copy copy-constructor assignment-operator