私は自由な時間に C++ の基礎を学び、本の演習に従っています。まず、行として 9 を入力し、列として 8 を入力すると、malloc 解放エラーが発生します。第二に、出力として 0 を取得します。入力内容がわかりません。3 のルールを強化できるので、プログラムを書きたいと思います。もちろん宿題ではありません。また、難しい質問で効率的な質問だと思います。質問に答えていただけると助かります。私はグーグルで検索したので、解決策について中途半端なことを見つけることができません。また、コピー コンストラクタ、代入演算子、およびデストラクタをチェックして、エラーの場所を教えてもらえますか?
コンストラクターでこの表示からのアイデアを使用して、double の 2 次元動的配列を実装するクラス TwoD を記述します。動的配列を指す double へのポインター型のプライベート メンバーと、MaxRows と MaxCols である 2 つの int (または unsigned int) 値が必要です。デフォルトの行と列の最大サイズを選択するデフォルトのコンストラクターと、プログラマーが行と列の最大サイズを設定できるパラメーター化されたコンストラクターを提供する必要があります。さらに、特定の行と列のエントリを設定できる void メンバー関数と、特定の行と列のエントリを double 型の値として返すメンバー関数を提供する必要があります。注意: [ ] をオーバーロードすることは (詳細に応じて) 困難または不可能であるため、2 次元配列に対して希望どおりに機能します。したがって、通常の関数表記法を使用してアクセサー関数とミューテーター関数を使用するだけです。+ 演算子をフレンド関数としてオーバーロードして、2 つの 2 次元配列を追加します。この関数は、左側のオペランド TwoD オブジェクトの i 行 j 列の要素と、右側のオペランド TwoD オブジェクトの i 行 j 列の要素の和を i 行 j 列の要素とする TwoD オブジェクトを返す必要があります。コピー コンストラクター、オーバーロードされた演算子 =、およびデストラクターを提供します。データを変更しないクラス メンバー関数を 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;
}