gpt4 book ai didi

c++ - 如何调用对象/构造函数以返回二维数组

转载 作者:行者123 更新时间:2023-11-28 05:54:19 25 4
gpt4 key购买 nike

我的测试文件中提供了以下代码来实现:

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<< 矩阵部分,因为我可以在我的构造函数中打印出我的 2x4 矩阵而不需要这一行。但是,我被要求包括 cout<< 矩阵,我不确定我是否理解它是如何工作的。它在调用我的对象矩阵吗?如果是这样,我该如何返回二维数组 p_matrix,因为我无法从构造函数返回值?

我认为一种解决方案可能是重载我的 << 运算符,如下所示:

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 列后跟第 2 列,依此类推向前
  4. int GetIndex (const int rowIdx, const int columnIdx) const: 成员确定 rowIdx 指定的行和 columnIdx 指定的列中矩阵条目在一维数组(数据)中的位置(索引)的函数。

我不确定如何仅使用这些变量来使用运算符重载,所以这是最好的解决方案还是有替代方法?考虑到我无法更改测试文件或 4 个成员变量的限制

最佳答案

如你所说:

Within my .h file, the only member variables I'm allowed are ... double *data: the member variable that stores the address to the 1-D array of the matrix

所以,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)成为friendMatrix (或添加 setter/getter )。

顺便说一句,请注意矩阵通常存储为 double*而不是 double** .

关于c++ - 如何调用对象/构造函数以返回二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com