レポート課題:演算子オーバーロードを用いた文字列クラスの実装・テスト

訂正

配布したWordテンプレートにおいて、以下の誤りがありましたので訂正します。
表紙・チェック項目
誤)メンバ演算子関数で+演算子による文字列の連結演算子が実装されているか?
正)フレンド演算子関数で+演算子による文字列の連結演算子が実装されているか?
(2015/6/8再度修正 正・誤が入れ替わっていました。レポート課題としては、内容として矛盾が無ければどちらでもOKとします。申し訳ありません。大川)

課題

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

必須課題

オプション課題

注意点

表1 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メソッドを作成せよ
実装済
必須
機能備考必須機能かどうか
==演算子による文字列の一致判定が可能であること bool result = str1 == str2;
before: str1="123", str2="456"
after: result=false str1="123", str2="456"
メンバ演算子関数で作成せよ
引数はconst参照とすること
必須
=演算子によりMyStringクラス文字列オブジェクトの代入が可能であること str1 = str2;
before: str1="hoge", str2="Foo"
after: str1="Foo", str2="Foo"
メンバ演算子関数で作成せよ
引数はconst参照とすること
必須
+演算子によりMyStringクラス文字列オブジェクト同士の連結が可能であること str1 = str2 + str3;
before: str1="hoge", str2="Foo", str3="Bar"
after: str1="FooBar", str2="Foo", str3="Bar"
フレンド演算子関数で作成せよ
引数はconst参照とすること
必須
機能備考必須機能かどうか
<演算子による文字列の辞書順比較が可能であること bool result = str1 < str2;
before: str1="123", str2="456"
after: result=true str1="123", str2="456"
メンバ演算子関数で作成せよ
引数はconst参照とすること
オプション
>演算子による文字列の辞書順比較が可能であること bool result = str1 > str2;
before: str1="123", str2="456"
after: result=false str1="123", str2="456"
メンバ演算子関数で作成せよ
引数はconst参照とすること
オプション
<< ストリーム出力演算子による標準出力への出力が可能であること cout << str1;
before: str1="hoge"
after: str1="hoge", コンソール出力="hoge"
フレンド演算子関数で作成せよ
引数はconst参照とすること
オプション
>> ストリーム入力演算子による標準入力からの入力が可能であること cin >> str1;
before: コンソール入力="hoge", str1=""
after: str1="hoge"
フレンド演算子関数で作成せよ
引数は参照とすること
オプション

課題の補足説明

実装のヒント

"abc" == "ABC" ? "hoge" + "Foo" = ?

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

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

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

メイン関数 (main.cpp)

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

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

課題の意義

クラスの設計とは

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

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

クラスの実装とは

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

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

クラスのテストとは

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

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

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