まとめ:Matrix クラス
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 47/104。
チャレンジ
簡単この章で学んだすべての演算子オーバーロードのテクニックを統合した Matrix クラスを構築しましょう。直感的な演算子構文を通じて、算術演算、比較、要素アクセス、およびストリーム出力をサポートする、フル機能の行列を作成します。
コードは2つのファイルに分けて構成します:
Matrix.h: 動的メモリを使用して整数の2次元配列を管理するMatrixクラスを定義します。行列は以下をサポートする必要があります:- プライベートメンバ:2次元データ用の
int**ポインタ、および行と列用のsize_tメンバ - 行と列を受け取り、すべての要素を0で初期化するコンストラクタ
- 割り当てられたすべてのメモリを適切に解放するデストラクタ
- コピーコンストラクタとコピー代入演算子(自己代入チェックを伴うディープコピー)
- ゲッター
getRows()およびgetCols()(どちらも const) - 個々の要素を設定するための
set(row, col, value)メソッド - 要素を取得するための
get(row, col)const メソッド
以下の演算子を実装してください:
- 算術演算: 行列の加算と減算のための
+および-(新しい Matrix を値で返す) - 比較: 2つの行列が同じ次元を持ち、要素が同一であるかを確認するための
==および!= - ストリーム: 行列を行ごとに出力するためのフレンド関数としての
<<。要素はスペースで区切り、各行は改行する - 添字: 行へのポインタを返し、
matrix[row][col]構文を可能にする[](const 版と非 const 版の両方を提供)
算術演算子については、両方の行列が同じ次元であると仮定してください。比較演算子は、次元が異なる場合に
falseを返す必要があります。- プライベートメンバ:2次元データ用の
main.cpp: 入力を読み取って、2つの 2x2 行列を作成し操作します。入力形式は以下の通りです:- 最初の行列の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>各行の要素は半角スペースで区切って表示してください。比較結果には
trueまたはfalse(小文字)を出力してください。
例えば、行列 A に 1 2 3 4、行列 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入力の変換には std::stoi() を使用してください。演算子の一貫性を保つために、!= は == を利用して実装することを忘れないでください。また、ヘッダーファイルにはヘッダーガードを忘れずに含めてください。
自分で試してみよう
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// 最初の行列 (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: 2つの Matrix オブジェクトを作成する (各2行2列)
// TODO: set() メソッドを使用して行列に値を格納する
// TODO: 行列 A を出力する
// cout << "Matrix A:" << endl;
// << 演算子を使用して行列を出力する
// TODO: 行列 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 クラス