如何调用对象/构造函数以返回2D数组

时间:2015-12-31 13:51:54

标签: c++ arrays constructor operator-overloading

我的测试文件中已经给出了以下代码来实现:

cout << "Testing the Matrix constructors:" << endl;

cout << "Case 1: Creating a 2x4 matrix of zeros with the standard constructor:" << endl;
{
    Matrix matrix(2, 4);
    cout << matrix << endl;

目前我在构造函数的.cpp文件中的代码如下:

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

double **p_matrix = new double*[noOfRows];
for(int i=0; i< noOfRows; i++){
    p_matrix[i] = new double[noOfCols];
}

for(int i=0; i< noOfRows; i++){
    for(int j=0; j<noOfCols; j++){
        p_matrix[i][j] = 0;
    }
}

我的主要困惑是cout&lt;&lt;代码的矩阵部分,因为我可以在我的构造函数中打印出我的2x4矩阵,而不需要这一行。但是,我被要求包括cout&lt;&lt;矩阵,我不确定我是否理解它是如何工作的。它是在调用我的对象矩阵吗?如果是这样,我如何返回我的2D数组p_matrix,因为我无法从构造函数返回值?

我认为一个解决方案可能是重载我的&lt;&lt;运算符如下所示:

std::ostream& operator<<(std::ostream& output, const Matrix& rhs){
output << rhs.data << std::endl;
return output; }

我放rhs.data的原因是因为我尝试了rhs.matrix和rhs.p_matrix,但是得到了一个需要成员变量的错误。在我的.h文件中,我允许的唯一成员变量如下:

  1. int noOfRows:存储行数的成员变量
  2. int noOfColumns:存储列数的成员变量
  3. double * data:成员变量,用于存储按列排列的矩阵条目的1-D数组的地址,即第1列后跟第2列,依此类推 所述
  4. int GetIndex(const int rowIdx,const int columnIdx)const:成员 确定沿rowIdx指定的行和columnIdx指定的列中的矩阵条目的1-D数组(数据)的位置(索引)的函数。
  5. 我不确定如何仅使用这些变量来使用运算符重载,这是最好的解决方案还是有另一种方法?考虑到我无法更改测试文件或4个成员变量的限制

1 个答案:

答案 0 :(得分:1)

正如你所说:

  

在我的.h文件中,我唯一允许的成员变量是...... double * data:将地址存储到矩阵的1-D数组的成员变量

因此,Matrix构造函数应该初始化data属性,而不是本地double **p_matrix变量(然后将data保留为未初始化)...

简单地替换:

Matrix::Matrix (const int noOfRows, const int noOfCols)
{
    double **p_matrix = new double*[noOfRows];
    for(int i=0; i< noOfRows; i++){
        p_matrix[i] = new double[noOfCols];
    }

    for(int i=0; i< noOfRows; i++){
        for(int j=0; j<noOfCols; j++){
            p_matrix[i][j] = 0;
        }
    }
}

人:

<强> 1。如果您的data属性为double**

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

    this->noOfRows = noOfRows;
    this->noOfCols = noOfCols; 

    data = new double*[noOfRows];
    for(int i=0; i< noOfRows; i++){
        data[i] = new double[noOfCols];
    }

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

稍后,你可以这样做:

std::ostream& operator<<(std::ostream& output, const Matrix& rhs)
{
    for( int i=0; i< noOfRows; i++){
        for( int j=0; j < noOfCols; j++){
            output << rhs.data[i][j] << " "; // next column
        }
        output << std::endl; // next line
    }
    return output; 
}

<强> 2。如果您的data属性为double*

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

    this->noOfRows = noOfRows;
    this->noOfCols = noOfCols;

    data = new double[noOfRows*noOfCols];
    for(int i=0; i< noOfRows*noOfCols; i++){
        data[i] = 0;
    }
}

稍后,你可以这样做:

std::ostream& operator<<(std::ostream& output, const Matrix& rhs)
{
    for( int i=0; i< noOfRows; i++){
        for( int j=0; j < noOfCols; j++){
            output << rhs.data[noOfCols*i+j] << " "; // next column
        }
        output << std::endl; // next line
    }
    return output; 
}

在这两种情况下,请确保在您的标头文件中公开data,或将operator<<(std::ostream& output, const Matrix& rhs)设为friend Matrix(或添加获取者)。

顺便提一下,请注意矩阵通常存储为double*而不是double**