读取使用运算符创建的矩阵

Reading a matrix created using an operator

你好 Whosebug 社区。我需要一些代码方面的帮助(我是 C++ 的新手,所以请多多关照)。我正在尝试使用 operator() 创建矩阵,存储输入文件中的数据,然后写入输出文件。下面的代码已经简化了一点。头文件如下:

//Data Header File

#ifndef Data_h
#define Data_h

#include <iostream>

using namespace std;

class Data
{
private:
    int d_elems;
    int rows_, cols_;
    int dataRows;
    int *p;
public:
    //Constructor
    femData();
    femData(int Row, int Col);

    //Copy Constructor
    //femData(const int d_elems);

    //Destructor
    virtual ~femData();

    //Operator
    int& operator() (int Rows, int Cols);

    //Functions
    void readData(istream &inp);  //Read Data from Input File
    void writeData(ostream &out);  //Write Data from Output File
};
#endif

任何我的 .cpp 文件:

//.cpp file
#include "stdafx.h"
#include "Data.h"
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>

using namespace std;

Data::Data() {}  //Blanket Constructor

Data::Data(int Row, int Col) //Matrix Constructor
    : rows_ (Row), cols_ (Col)
{
    if (Row == 0 || Col == 0)
    {
        cout << "\nMatrix is Zero..." << endl;
        system("pause");
        exit(0);
    }
    p = new int[Row * Col];
}

int& Data::operator()(int Rows, int Cols)  //Operator for Matrix
{
    if (Rows >= rows_ || Cols >= cols_)
    {
        cout << "\nMatrix subscript out of bounds\n";
        system("pause");
        exit(0);
    }
    return p[cols_ * Rows + Cols];
}

Data::~Data() { /*delete[] p;*/}  //Destructor

void Data::readData(istream &inp)
{
    inp >> dataRows;
    int e_id;
    //Data (dataRows, 10);  //How would I call this constructor?
    rows_ = dataRows;
    cols_ = 10;

    for (int i = 0; i < dataRows; i++)
    {
        inp >> e_id;

        if ((e_id - 1) != i)
        {
            cout << "\nError Reading Data..." << endl;
            cout << "Program Will End\n!" << endl;
            system("pause");
            exit(0);
        }

        (*this)(i, 0) = d_eid;

        for (int j = 1; j < 10; j++)
        {
            inp >> (*this)(i, j);
        }
    }

    void femData::writeData(ostream & out)
    {
        //Output Info
        out << setfill('-') << setw(90) << "-" << endl;
        out << setfill(' ') << setw(34) << " Matrix Information " << endl;
        out << setfill('-') << setw(90) << "-" << "\n\n" << endl;
        out << setfill(' ');
        out << setw(10) << "ID";
        out << setw(10) << "Data 1";
        out << setw(10) << "Data 2";
        out << setw(10) << "Data 3";
        out << setw(10) << "Data 4";
        out << setw(10) << "Data 5";
        out << setw(10) << "Data 6";
        out << setw(10) << "Data 7";
        out << setw(10) << "Data 8" << endl;

        for (int i = 0; i < dataRows; i++)
        {
            out << setw(7) << ((p + i) + 0);
            out << setw(10) << ((p + i) + 1);
            out << setw(10) << ((p + i) + 2);
            out << setw(10) << ((p + i) + 3);
            out << setw(10) << ((p + i) + 4);
            out << setw(10) << ((p + i) + 5);
            out << setw(10) << ((p + i) + 6);
            out << setw(10) << ((p + i) + 7);
            out << setw(10) << ((p + i) + 8) << endl;
            //Note ((p + i) + 8) is omitted
        }
    }

我遇到的问题是输出。调用 WriteData 函数时,它会写入输出文件,但不会写入它读取的数据。相反,所有写的都是 {0 1 2 3 4 5 6 7 8} {1 2 3 4 5 6 7 8 9} {etc.} 其中 {is used here to denote different rows}

此外,如果我尝试输出 d_elems(i,0) 而不是 ((d_elems + i) + 0),编译器会告诉我我需要一个指向函数类型的指针。

非常感谢任何帮助,谢谢。

你的readData是错误的。您读取本地对象 Data d_data(dataRows,10); 中的数据,然后在函数结束时将其销毁。您没有填写当前实例的数据。你需要直接读入 `p'

inp >> p[i * rows_ + j];

或使用您在当前实例上定义的operator(),例如

inp >> (*this)(i,j); // this is preferable

附带问题:您在 class 头文件 int *p;.

中缺少 p 的声明

附带问题 2:您的 int& Data::operator()(int Rows, int Cols) 令人困惑,请尝试使用 int& Data::operator()(int i, int j)return p[i * _cols + j];,因为它更易于阅读。