过载功能>>输入矩阵(类)不起作用

时间:2014-03-11 18:50:55

标签: c++ class oop operator-overloading istream

所以,我写了这个课,看起来有点像这样:

class matrix
{
    // Friends
    friend ostream & operator << (ostream &os, const matrix &mat);
    friend istream & operator >> (istream &is, matrix &mat); 
    private:
        double *mdata;
        int rows, columns, size;

然后我写了:

// Assignment operator
    public:
        matrix & operator=(const matrix &m)  {
            if(&m == this) {
                return *this; // no self assignment
            }


    // First delete this object's array
        delete[] mdata;
        columns=0;
        rows=0;
        mdata=0;
        int size=0;
        // Now copy size and declare new array
        size=m.getcols()*m.getrows();
        if(size>0) {
            mdata=new double[size];
            // Copy values into new array
            for(int i=0;i<size;i++) {
                mdata[i] = m.mdata[i];
            }
        }
        columns = m.getcols();
        rows = m.getrows();
        return *this; // Special pointer
    }

我在课外有这个:

ostream & operator << (ostream &os, const matrix &mat) {
    // Code goes here
    os << "\n";
    int j = 1;
    for (int i=0; i < mat.size; i++) {
        os << mat.mdata[i] << " ";
        if (i+1 == j*mat.getcols()) {
            os << "\n";
            j = j + 1;
        }
    }
    os << "\n";
    os << "Wolfram|Alpha code:\n[[";
    j = 1;
    for (int i=0; i < mat.size; i++) {
        os << mat.mdata[i];
        if (i+1 != j*mat.getcols()){
            os << ",";
        }
        if (i+1 == j*mat.getcols()) {
            if (i+1 != mat.size) {
                os << "],[";
            }
            else {
                os << "]";
            }
            j = j + 1;
        }
    }
    os << "] \n";
    return os;
}

istream & operator >> (istream &is, matrix &mat) { 
    is >> mat.rows >> mat.columns;
    int size(mat.rows*mat.columns);
    if(size>0) {
        cout << "Enter " << size << " values (top row, second row... last row - left to right)" << endl;
        mat.mdata=new double[size];
        // Copy values into new array
        for(int i=0;i<size;i++) {
            is >> mat.mdata[i];
        }
    }
    return is;
}

但是在运行代码时(在main中):

cout << "Enter the rows and columns of a custom Matrix, row then column:" << endl;
matrix custom;
cin >> custom;
cout << custom;
cout << custom.getrows() << endl;

我没有打印出任何价值......

Enter the rows and columns of a custom Matrix, row then column:
Default matrix constructor called
2
2
Enter 4 values (top row, second row... last row - left to right)
1 2 3 4


Wolfram|Alpha code:
[[] 
2
Destructor called

关于我做错了什么的任何想法?完整代码here

编辑: 忘了说,我包含了赋值运算符,因为它有相同(或类似)的问题。

1 个答案:

答案 0 :(得分:1)

您永远不会在mat.size重载中更新operator>>,所以尽管您读入了4个值,但矩阵认为它是空的并且没有输出任何内容。

另外,非常重要的是,如果传递给operator>>重载的矩阵已经有数据,那么你将泄漏内存,因为你没有释放这些数据并且你分配了一个指向mat.mdata的新指针

你可以这样做:

istream & operator >> (istream &is, matrix &mat) { 
    int rows, columns;
    is >> rows >> columns;
    if (!is)
        return is;  // couldn't read rows and cols
    matrix tmp(rows, columns);
    if(tmp.size>0) {
        cout << "Enter " << tmp.size << " values (top row, second row... last row - left to right)" << endl;

N.B。不要在这里分配一个新数组,这是在上面的构造函数中完成的。

       // Copy values into new array
        for(int i=0;i<tmp.size;i++) {
            is >> tmp.mdata[i];
        }
    }
    if (is)   // read all values successfully
        mat = tmp;

这要求您的分配操作员正常工作,这是确保这一点的好时机!另一种选择是交换:

        mat.swap(tmp);

这需要一个正确的matrix::swap(matrix&)成员函数,这有很多原因。

    return is;
}

注意我进行了错误检查,以确保您实际从流中读取了预期的数据。

您的赋值运算符中的错误在于:

        int size=0;
        // Now copy size and declare new array
        size=m.getcols()*m.getrows();

您声明一个名为size的新局部变量,并更新该变量。这意味着this->size永远不会得到更新。您不想声明新的size,只想更新成员变量,因此请将上述内容更改为:

        // Now copy size and declare new array
        size=m.getcols()*m.getrows();