【问题标题】:C++ copy constructor, assignment 'operator='C++ 复制构造函数,赋值 'operator='
【发布时间】: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


【解决方案1】:

您正在滥用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 外部类的定义是无效的说明符。

【讨论】:

  • 您的第一个示例需要inline。此外,您还缺少一个有效选项:friend 在类定义中定义的函数。
  • 非常感谢您的回复。我试过了,但我仍然得到这个错误:在 math_utils::Simple2DMatrix::operator+(const math_utils::Simple2DMatrix&)(((const math_utils::Simple2DMatrix)(& mB)中不匹配'operator =' .math_utils::Matrix3x3::)))' 。我之前提到的让我很困惑的事情是,当我使用相同的定义将赋值符号定义为“==”时,它起作用了!!!你有什么想法为什么会发生这种情况?我将非常感谢您的帮助。 @40two
  • @juanchopanza 我尝试了所有仍然相同的错误。我真的很困惑!
  • @user3506463 阅读您问题的前两个 cmets,然后采取行动。
  • @juanchopanza 我也尝试使用 const 引用!同样的错误!我不明白为什么!您认为符号“=”应该以特定方式定义吗?为什么 '==' 可以很好地用作赋值运算符!
【解决方案2】:

我的直觉告诉我,您的 const 正确性在某处有问题。请发布完整的错误消息。

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

struct A
{
  float retunrsSomethingButDoesNotChangesA()const; // <- note the const
};

// in cpp:
float A::retunrsSomethingButDoesNotChangesA()const // <- note the const
{
  return 5.5f;
}

如果函数没有改变它们,则为函数const做引用参数。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2012-03-01
    • 2013-06-18
    相关资源
    最近更新 更多