【问题标题】:negation operator overloading in a class with a 2d array具有二维数组的类中的否定运算符重载
【发布时间】:2013-12-23 21:04:23
【问题描述】:

我用一个二维数组创建了一个名为 Matrix 的类。我可以使用构造函数、复制构造函数和析构函数来运行它。当我引入一元否定运算符时,我得到一个运行时错误。

https://gist.github.com/anonymous/7823794

#ifndef MATRIX_H
#define MATRIX_H
class Matrix
{
public:
    Matrix(int rSize=3, int cSize=3);
    Matrix(const Matrix& m);
    ~Matrix();
    bool setValue(int rSize, int cSize, int value);
    bool getValue(int rVal, int cVal, int& value)const;
    const Matrix operator- ();
private:
    int rowSize;
    int columnSize;
    int** arr;
};
#endif



#include<iostream>
#include"Matrix.h"
using namespace std;
Matrix::Matrix(int rSize,int cSize)
{
    columnSize = cSize;
    rowSize = rSize;
    arr = new int* [rowSize];
    for(int i=0; i<rowSize; i++)
        arr[i] = new int[columnSize];
    for(int j=0; j<rowSize; j++)
    {
        for(int k=0; k<columnSize; k++)
            arr[j][k] = 0;
    }

}
Matrix::Matrix(const Matrix& m)
{
    columnSize = m.columnSize;
    rowSize = m.rowSize;
    arr = new int* [rowSize];
    for(int i=0; i<rowSize; i++)
    {
        arr[i] = new int [columnSize];
    }
    for(int i=0; i<rowSize; i++)
    {
        for(int j=0; j<columnSize; j++)
            arr[i][j] = m.arr[i][j];
    }
}
Matrix::~Matrix()
{
    for(int i = 0; i < rowSize; ++i)
        delete [] arr[i];
    delete [] arr;
}
bool Matrix::setValue(int rVal, int cVal, int value)
{
    if((rVal<0)||(cVal<0)||(rVal>rowSize-1)||(cVal>columnSize-1))
        return false;
    arr[rVal][cVal] = value;
    return true;
}
bool Matrix::getValue(int rVal, int cVal, int& value)const
{
    if((rVal<0)||(cVal<0)||(rVal>rowSize-1)||(cVal>columnSize-1))
        return false;
    value = arr[rVal][cVal];
    return true;
}
const Matrix Matrix:: operator- ()
{
    Matrix m(*this);
    for (int i = 0; i< rowSize; i++)
    {
        for(int j=0; j<columnSize; j++)
            m.arr[i][j] = (this->arr[i][j])* -1 ;
    }
    return m;
}





#include<iostream>
#include"Matrix.h"
using namespace std;
void main()
{
    Matrix m(4, 5);
    Matrix m2(m);
    m2.setValue(1,2,12);
    int x;
    m2.getValue(1,2,x);
    Matrix m3;
    m3 = -m2;
}

编辑:按照@unwind 和@interjay 的建议,我首先实现了赋值运算符,并为否定运算符返回了一个值,而不是引用,它可以工作。谢谢大家的帮助

【问题讨论】:

  • 您应该将代码粘贴到此处,以便在遥远的将来有人看到您的帖子时可用。
  • @Abhineet 有没有比手动在每行添加四个空格更简单的缩进方法?
  • @user3012044 选择代码并按工具栏中的{} 按钮或Ctrl+K。
  • 简单的答案是使用std::vector,而不是自己管理内存。如果您出于教育原因真的想玩弄指针,请始终记住Rule of Three
  • 选择要缩进的文本并按“CTRL+k”。它会自动缩进代码。

标签: c++ class overloading operator-keyword


【解决方案1】:

你的类中没有赋值运算符,这将导致赋值后成员指针被双重删除(并且你在m3 = -m2;行中赋值)。

你应该遵守rule of three

unwind 否定运算符应该按值返回也是正确的:你不应该从函数返回对局部变量的引用,因为这会导致未定义的行为。

【讨论】:

  • 我还应该按值返回“+”和“-”运算符还是按引用返回?
  • @user3012044 按值。您不能通过引用返回局部变量或临时变量,因为它会在函数返回时停止存在。
【解决方案2】:

声明运算符返回const Matrix&amp;,然后返回一个局部变量是错误的。那肯定是悬空的参考吗?

请参阅this answer 以获取参考,其中运算符返回一个实际的新值,而不是参考。这对我来说更有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2020-11-04
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多