復習 - Matrixクラス
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 47/104。
チャレンジ
簡単この章で学んだすべての演算子オーバーロード技法を組み合わせた Matrix class を作成しましょう。算術演算、比較、要素アクセス、ストリーム出力をサポートする、完全な機能を備えた行列を作成します。すべてを直感的な演算子構文で実行できます。
コードを2つのファイルに分けて構成します。
Matrix.h: 動的メモリを使用して整数の2次元配列を管理するMatrixclass を定義します。行列は次をサポートする必要があります。- Private members: 2D data 用の
int**ポインター、および行と列用のsize_tmembers - 行と列を受け取り、すべての要素を 0 に初期化する constructor
- 割り当てられたすべてのメモリを適切に解放する destructor
- copy constructor と copy assignment operator(deep copy と self-assignment check)
- Getters
getRows()とgetCols()(どちらも const) - 個々の要素を設定する
set(row, col, value)method - 要素を取得する
get(row, col)const method
次の operators を実装します。
- Arithmetic: 行列の加算と減算を行う
+と-(新しい Matrix を値として返す) - Comparison: 2つの行列の次元が同じで、要素が一致しているかを check する
==と!= - Stream: friend function としての
<<。行列を行ごとに出力し、要素はスペースで区切り、各行を新しい行に表示する - Subscript: 行へのポインターを返し、
matrix[row][col]構文を可能にする[](const と non-const の両方の versions を提供する)
Arithmetic operators では、両方の行列の次元が同じであると仮定します。Comparison operators は、次元が異なる場合に
falseを返す必要があります。- Private members: 2D data 用の
main.cpp: 2つの 2x2 行列を作成して操作するための入力を読み取ります。入力形式は次のとおりです。- 最初の行列の4つの整数(行ごと):a00, a01, a10, a11
- 2番目の行列の4つの整数(行ごと):b00, b01, b10, b11
2つの
Matrixobjects(それぞれ 2 行、2 列)を作成し、set()method を使用して値を設定した後、operators を実演します。出力形式:
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(小文字)を出力します。
たとえば、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入力変換には std::stoi() を使用します。operators の一貫性を保つため、!= は == in terms of で実装してください。header file には header guards を忘れずに追加してください。
自分で試してみよう
#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: 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++オンラインコンパイラ