復習 - Matrixクラス
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 47/104。
チャレンジ
簡単この章で学んだすべての演算子オーバーロードの技法を組み合わせたMatrixクラスを作りましょう。算術演算、比較、要素へのアクセス、ストリーム出力に対応する、機能を備えた行列を作成します。すべて直感的な演算子構文で扱えます。
コードは2つのファイルに分けます。
Matrix.h: 動的メモリを使用して2次元整数配列を管理するMatrixクラスを定義します。行列は次の機能を備える必要があります。- プライベートメンバー: 2次元データ用の
int**ポインターと、行数および列数用のsize_tメンバー - 行数と列数を受け取り、すべての要素を0に初期化するコンストラクター。行ポインターの配列を確保し、続いて各行を確保します。
data = new int*[rows];および各行rに対するdata[r] = new int[cols];を使用します。 - 確保したメモリをすべて適切に解放するデストラクター。まず各行に対して
delete[]を実行し、その後delete[] data;を実行します。 - コピーコンストラクターとコピー代入演算子(自己代入チェックを伴うディープコピー)
- ゲッター
getRows()とgetCols()(どちらもconst) - 個々の要素を設定する
set(row, col, value)メソッド - 要素を取得するconstメソッド
get(row, col)
次の演算子を実装します。
- 算術演算: 行列の加算と減算を行う
+および-(新しいMatrixを値として返す) - 比較: 2つの行列の次元と要素がすべて同じかを判定する
==および!= - ストリーム: 行列を行ごとに出力するフレンド関数としての
<<。要素はスペースで区切り、各行は改行します。 - 添字: 行へのポインターを返し、
matrix[row][col]という構文を可能にする[](const版と非const版の両方を用意します)
算術演算子については、両方の行列の次元が同じであると仮定します。比較演算子は、次元が異なる場合に
falseを返す必要があります。- プライベートメンバー: 2次元データ用の
main.cpp: 入力を読み取り、2つの2x2行列を作成して操作します。入力形式は次のとおりです。- 1つ目の行列の4つの整数(行ごとの順):a00, a01, a10, a11
- 2つ目の行列の4つの整数(行ごとの順):b00, b01, b10, b11
2つの
Matrixオブジェクト(それぞれ2行、2列)を作成し、set()メソッドを使って値を設定した後、演算子の動作を示します。出力形式:
Matrix A: <row0> <row1> Matrix B: <row0> <row1> A + B: <row0> <row1> A - B: <row0> <row1> A == B: <true/false> A != B: <true/false> A[0][0]: <value> A[1][1]: <value>各行では、要素を1つのスペースで区切って表示します。比較結果は
trueまたはfalse(小文字)で出力します。
たとえば、Matrix Aの入力が1 2 3 4で、Matrix B:の入力が5 6 7 8の場合:
Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4演算子の一貫性を保つため、!=は==を使って実装してください。ヘッダーファイルにヘッダーガードを忘れずに追加してください。
自分で試してみよう
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// 1つ目の行列(2x2)の入力を読み込む:a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// 2つ目の行列(2x2)の入力を読み込む:b00, b01, b10, b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: Matrixオブジェクトを2つ作成する(それぞれ2行2列)
// TODO: set()メソッドを使って行列に値を設定する
// TODO: Matrix Aを出力する
// cout << "Matrix A:" << endl;
// <<演算子を使って行列を出力する
// TODO: Matrix Bを出力する
// cout << "Matrix B:" << endl;
// <<演算子を使って行列を出力する
// TODO: A + Bを出力する
// cout << "A + B:" << endl;
// TODO: A - Bを出力する
// cout << "A - B:" << endl;
// TODO: 比較結果を出力する
// cout << "A == B: " << (true/false の判定に三項演算子を使う) << endl;
// cout << "A != B: " << (true/false の判定に三項演算子を使う) << endl;
// TODO: 添字によるアクセス結果を出力する
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ