Menu
Coddy logo textTech

まとめ:Matrix クラス

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 47/104。

challenge icon

チャレンジ

簡単

この章で学んだすべての演算子オーバーロードのテクニックを統合した 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 を返す必要があります。

  • main.cpp: 入力を読み取って、2つの 2x2 行列を作成し操作します。入力形式は以下の通りです:
    1. 最初の行列の4つの整数(行ごと):a00, a01, a10, a11
    2. 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;
}

オブジェクト指向プログラミングのすべてのレッスン