我尝试在空闲时间学习 C++ 基础并遵循一本书的练习。首先,当我输入 9 作为行和 8 作为列时,我得到 malloc freeing 错误。其次,我得到 0 作为输出,我看不到我输入的内容。我想编写程序,因为我可以加强三法则。这当然不是家庭作业。此外,我认为这是一个困难的问题和有效的问题。如果可以回答问题,那将很有帮助。因为我在谷歌上搜索过,所以我找不到关于解决方案的一半体面的东西。另外,你能检查我的复制构造函数、赋值运算符和析构函数并告诉我我的错误在哪里吗?
编写一个类 TwoD,它在其构造函数中使用此显示的想法来实现二维动态双精度数组。您应该有一个指向 double 类型的私有成员以指向动态数组,以及两个 int(或无符号 int)值,它们是 MaxRows 和 MaxCols。您应该提供一个默认构造函数,您将为其选择默认的最大行和列大小,以及一个允许程序员设置最大行和列大小的参数化构造函数。此外,您应该提供一个允许设置特定行和列条目的 void 成员函数,以及一个将特定行和列条目作为 double 类型的值返回的成员函数。备注:重载 [ ] 很困难或不可能(取决于细节),因此它可以像您希望的那样用于二维数组。因此,只需使用普通函数表示法来使用访问器和修改器函数。将 + 运算符重载为友元函数以添加两个二维数组。此函数应返回 TwoD 对象,其第 i 行第 j 列元素是左侧操作数 TwoD 对象的第 i 行第 j 列元素与右侧操作数 TwoD 对象的第 i 行第 j 列元素之和。提供一个复制构造函数、一个重载的运算符 = 和一个析构函数。将不更改数据的类成员函数声明为 const 成员。左侧操作数 TwoD 对象的第 j 列元素和右侧操作数 TwoD 对象的第 i 行第 j 列元素。提供一个复制构造函数、一个重载的运算符 = 和一个析构函数。将不更改数据的类成员函数声明为 const 成员。左侧操作数 TwoD 对象的第 j 列元素和右侧操作数 TwoD 对象的第 i 行第 j 列元素。提供一个复制构造函数、一个重载的运算符 = 和一个析构函数。将不更改数据的类成员函数声明为 const 成员。
我的努力
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class TwoD
{
public:
TwoD();
TwoD(int row, int column);
void setRowCol();
double getVal(int row, int column);
friend const TwoD operator +(const TwoD& first, const TwoD& second);
int getterRow() const;
int getterCol() const;
void setterRow(int row);
void setterCol(int column);
TwoD(const TwoD& object);
TwoD& operator =(const TwoD& rightSide);
void putArr() const;
~TwoD();
static TwoD constructFromUserInput();
private:
int MaxRows;
int MaxCols;
double **arr;
};
int main(int argc, char const *argv[])
{
cout << "All size of TwoD object must be same\n\n";
TwoD arr1 = TwoD::constructFromUserInput();
TwoD arr2 = TwoD::constructFromUserInput();
TwoD arr3;
arr3 = arr1 + arr2;
TwoD arr4(arr3);
arr1.putArr();
arr2.putArr();
arr3.putArr();
arr4.putArr();
return 0;
}
void TwoD::setRowCol()
{
int r_user;
int c_user;
cout << "Enter num of rows => ";
cin >> r_user;
cout << "Enter num of columns => ";
cin >> c_user;
MaxRows = r_user;
MaxCols = c_user;
TwoD(MaxRows,MaxCols);
}
TwoD::TwoD(int row, int column)
: MaxRows(row), MaxCols(column)
{
arr = new double*[row];
for (int i = 0; i < row; i++)
{
arr[i] = new double[column];
}
for (int i = 0; i < MaxRows; i++)
{
for (int j = 0; j < MaxCols; j++)
{
cout << "Enter for " << i << j << "=> ";
cin >> arr[i][j];
}
}
}
TwoD::TwoD()
: MaxRows(2), MaxCols(2)
{
arr = new double*[2];
for (int i = 0; i < 2; i++)
{
arr[i] = new double[2];
}
}
double TwoD::getVal(int row, int column)
{
return arr[row][column];
}
const TwoD operator +(const TwoD& first, const TwoD& second)
{
TwoD sum;
for (int i = 0; i < first.MaxRows; i++)
{
for (int j = 0; j < first.MaxCols; j++)
{
sum.arr[i][j] = first.arr[i][j] + second.arr[i][j];
}
}
return sum;
}
TwoD::TwoD(const TwoD& object)
{
MaxRows = object.MaxRows;
MaxCols = object.MaxCols;
arr = new double*[MaxRows];
for (int i = 0; i < MaxRows; i++)
{
arr[i] = new double[MaxCols];
}
for ( int i = 0; i < MaxRows; i++ )
{
for ( int j = 0; j < MaxCols; j++ )
{
arr[i][j] = object.arr[i][j];
}
}
}
TwoD::~TwoD()
{
for (int i = 0; i < MaxRows; i++)
delete [] arr[i];
delete [] arr;
}
TwoD& TwoD::operator =(const TwoD& rightSide)
{
if (this == &rightSide)
{
return *this;
}
for (int i = 0; i < MaxRows; i++)
delete [] arr[i];
delete [] arr;
arr = new double*[rightSide.MaxRows];
for (int i = 0; i < rightSide.MaxRows; i++)
{
arr[i] = new double[rightSide.MaxCols];
}
MaxRows = rightSide.MaxRows;
MaxCols = rightSide.MaxCols;
for (int i = 0; i < MaxRows; i++)
{
for (int j = 0; j < MaxCols; j++)
{
arr[i][j] = rightSide.arr[i][j];
}
}
return *this;
}
void TwoD::putArr() const
{
for (int i = 0; i < MaxRows; i++)
{
for (int j = 0; j < MaxCols; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int TwoD::getterRow() const
{
return MaxRows;
}
int TwoD::getterCol() const
{
return MaxCols;
}
void TwoD::setterRow(int row)
{
MaxRows = row;
}
void TwoD::setterCol(int column)
{
MaxCols = column;
}
TwoD TwoD::constructFromUserInput()
{
int r_user;
int c_user;
cout << "Enter num of rows => ";
cin >> r_user;
cout << "Enter num of columns => ";
cin >> c_user;
// Construct an object.
TwoD obj(r_user, c_user);
// Return the object
return obj;
}