レポート課題:演算子オーバーロードを使用した文字列クラスの作成とテスト

課題

課題1−5(中級編1週目)で作成したプロジェクトp3kadai2w1をベースとして、次の機能を持つ文字列クラス(MyString)を作成しテストしなさい。

機能備考必須機能かどうか
オブジェクトの生成が可能であること MyString str1, str2;
before: str1=存在しない, str2=存在しない
after: str1="", str2=""
デフォルトコンストラクタを作成せよ
実装済
必須
char配列文字列をもとにしたオブジェクトの生成が可能であること MyString str1("Foo");
before: str1=存在しない
after: str1="Foo"
引数をもつコンストラクタを作成せよ
実装済
必須
オブジェクトのコピーが可能であること MyString str1 (str2);
before: str1=null, str2="Foo"
after: str1="Foo", str2="Foo"
コピーコンストラクタを作成せよ
実装済
必須
標準出力に文字列を出力できること
(デバッグ用観測メソッド)
str1.printString();
before: str1="hoge"
after: str1="hoge", コンソール出力="hoge"
printStringメソッドを作成せよ
実装済
必須
char配列文字列へ読み取り専用ポインタを取得可能であること
(デバッグ用観測メソッド)
const char* ca = str.getConstCharArray();
before: str="hoge"
after: str1="hoge", ca="hoge"
getConstCharArrayメソッドを作成せよ
実装済
必須
任意の文字への参照を返す機能を持つこと str1.getChar(2) = 'G';
before: str1="hoge"
after: str1="hoGe"
getCharメソッドを作成せよ
実装済
必須
=演算子によりMyStringクラス文字列オブジェクトの代入が可能であること str1 = str2;
before: str1="hoge", str2="Foo"
after: str1="Foo", str2="Foo"
メンバ演算子関数で作成せよ必須
=演算子によりchar配列文字列の代入が可能であること str1 = "Foo";
before: str1="hoge"
after: str1="Foo"
メンバ演算子関数で作成せよオプション
+演算子によりMyStringクラス文字列オブジェクト同士の連結が可能であること str1 = str2 + str3;
before: str1="hoge", str2="Foo", str3="Bar"
after: str1="FooBar", str2="Foo", str3="Bar"
フレンド演算子関数で作成せよ必須
<演算子による文字列の辞書順比較が可能であること bool result = str1 < str2;
before: str1="123", str2="456"
after: result=true str1="123", str2="456"
メンバ演算子関数で作成せよ必須
>演算子による文字列の辞書順比較が可能であること bool result = str1 > str2;
before: str1="123", str2="456"
after: result=false str1="123", str2="456"
メンバ演算子関数で作成せよ必須
==演算子による文字列の一致判定が可能であること bool result = str1 == str2;
before: str1="123", str2="456"
after: result=false str1="123", str2="456"
メンバ演算子関数で作成せよ必須
<< ストリーム出力演算子による標準出力への出力が可能であること cout << str1;
before: str1="hoge"
after: str1="hoge", コンソール出力="hoge"
特になしオプション
>> ストリーム入力演算子による標準入力からの入力が可能であること cin >> str1;
before: コンソール入力="hoge", str1=""
after: str1="hoge"
特になしオプション

必須課題

なお、テストの際にprintStringメソッドおよびgetConstCharArrayメソッドはオブジェクトの状態を観測するためのデバッグ用メソッドと位置づけ、printStringメソッドおよびgetConstCharArrayメソッド自体のテストは除外してよい。

参考として機能仕様・実装仕様・検証仕様・テスト結果のサンプルを示す。これを参考して完全なものにして提出する事。

また、テスト環境はmain.cppTestMyString.hおよびTestMyString.cppを使用して良い。テストプログラムは、一部を除き実装されていないので、各自必要な部分を実装すること。

提出するレポートは、Wordテンプレートを元に作成し、必要に応じてExcelから図表をコピーすること。最終的にはPDFに変換して提出すること。

オプション課題

提出物

以下のものを、一つのZIPファイルにまとめて提出する事。

課題の説明

クラスの設計とは

機能仕様を作成することにより、開発対象を明確化できる。

また、クラスを利用する人が必要な情報を整理することが出来る(マニュアルが完成)。

クラスの実装とは

実装仕様を作成することにより、実装の際の注意点を事前に洗い出し、実装後になってからの手戻りを減らすことが出来る。

今回は必要が無いと思われるが、メソッド内部の動作が複雑な場合は、フローチャートなどの図を用いて検討した結果を示すこともある。

クラスのテストとは

検証とは、実装と仕様が一致していることを確認することである。

検証仕様(テスト項目)を作成することにより、実装するプログラムが備えるべき機能が明確になる。

テストを実施することにより、プログラムが期待通りに実装できている事を確認できる。

実装のヒント

レポートに掲載する結果とは

  1. テスト項目表と、テスト結果のPASS/FAIL
  2. テストプログラムについてデバッガ上で実行し、メモリリークが発生しないことを確認した結果
  3. オプション課題まで作成した場合は、その結果

なお、メモリリークが発生せずに動作していることを以下のメイン関数を用いて確認すること。

メイン関数 (main.cpp)

また、入力された文字列をメンバ変数にセットする関数は以下のようにかけるので、参考にすると良い。

テスト環境のソースコードを以下に示す。