c++ - 如何使用静态成员函数创建一个矩阵,然后可以使用运算符重载打印该矩阵?

标签 c++ matrix segmentation-fault operator-overloading static-members

使用构造函数和运算符重载的工作原理如下,我的目标是创建一个 2x4 的零矩阵:

Matrix::Matrix(const int noOfRowss, const int noOfCols){

this->noOfRows=noOfRowss;
this->noOfColums=noOfCols;

data= new double[noOfRows*noOfColumns];

    for(int i=0; i< noOfRows; i++){
        for(int j=0; j<noOfColumns; j++){
           int index = i*noOfColumns + j;
           data[index]=0;
        }
    }
}

std::ostream& operator<<(std::ostream& output, const Matrix& rhs){
    for(int i=0; i< rhs.noOfRows; i++){
        for(int j=0; j<rhs.noOfColumns; j++){
            int index = i*rhs.noOfColumns + j;
            output<<rhs.data[index]<< "\t";
        }
        output<<std::endl;
    }
    return output;
}

但是,当我尝试使用静态成员函数时,出现以下代码的段错误(请参阅下面的测试文件中的实现):
Matrix Matrix::Zeros(const int noOfRows, const int noOfCols){
    Matrix out;
    for(int i=0; i< noOfRows; i++){
        for(int j=0; j<noOfCols; j++){
           int index = i*noOfCols + j;
           out.data[index]=0;
        }
    }
}

我不确定我是否正确实现了静态成员函数,我的问题是在我的头函数中我需要使用以下变量:
int noOfRows;
int noOfColumns;
double *data;
int GetIndex(const int rowIdx, const int columnIdx) const;

在我的测试文件中,我想实现这个静态成员函数如下:
Matrix matrix = Matrix::Zeros(2,4);
cout<<matrix<<endl;

我需要保留数据变量的原因是它可以在 operator<< 重载函数中使用,因为它以前用于构造函数。但是,在我的静态成员函数中尝试了几种不同的变体后,我无法像以前那样轻松地将矩阵存储在数据变量中。有人有什么建议吗?

最佳答案

因此,我首先看到您的静态函数显然是这样做的。

Matrix output;

但是,您显示的构造函数代码采用两个参数,即行数和列数。

由此,我必须得出结论,您还必须有一个默认构造函数,它可能构造一个空矩阵,带有一个空 data vector 。
for(int i=0; i< noOfRows; i++){
    for(int j=0; j<noOfCols; j++){
       int index = i*noOfCols + j;
       output.data[index]=0;
    }
}

然后,这里尝试初始化默认构造矩阵的内容,而没有有效初始化 data成员。

这不会有好的结局……

P.S.,你可能也想读这个:RAII .我怀疑你们类在这方面也会有相关的问题。而不是使用 double *data成员,一个 std::vector<double>会更好地工作,并且很可能会避免该领域的许多陷阱。

关于c++ - 如何使用静态成员函数创建一个矩阵,然后可以使用运算符重载打印该矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34584138/

相关文章:

matlab - 是否可以在matlab中将矩阵旋转45度

c - 使用 fopen 时出现段错误

c++ - 使类不可复制 : Private undefined methods vs Deleted methods

c++ - 如何授予www数据用户访问权以运行使用来自Apache的/dev/ttyS1的进程

r - 将 R 中的矩阵展平为四列(索引和上/下三角形)

c++ - 使用指针将 2 个矩阵相乘

c++ - 仅当您按Enter或到达文件末尾时,该函数才导致段错误

c - 双向链表显示函数中的段错误

c++ - 如何指向链表中的下一个节点并打印值

c++ - Maybe 和 Either 单子(monad)、短路和性能