頑固者の文字列処理~文字列編~

 前回は可変長配列クラスを作り、忘れていたvirtualをこっそり付け足しました。

 次にするべきは勿論、文字列クラスの作成――ではあるのですが、ここで先に文字列の上限数を決めておきます。

適当に2^10にしておきます。

 そして、これを最大数としてクラスを作ります。

出来ました。

 ここで重要なのは、コンストラクタの処理内容。最初の部分に0を代入しています。

 C++における文字列処理では、終端文字を使います。名の通り、文字列の終わりを指す文字です。本来ならchar型での表記'\0'と書くべきではあるのですが、私は面倒なのでintでの内部値の0を代入しています。

 そして、最初に終端を置くということは、文字列は即座に終わる――つまりは空の文字列が出来ます。なので、これを以って初期化とします。

 

 また、上記の終端文字の仕様上、文字列は最後の1枠を考えて組む必要があります。つまりは、

・最後の1枠を考慮した空きの判定

・何らかの操作の度に末尾に0を置く処理

が必要になります。

 

 都合が良いので、挙げた順に作りましょう。前回作った中ではIsFullが該当します。

それをString側で書き換えます。メソッドを書いてoverrideを加えるだけのお手軽改変です。エラーが出た方は、前回作った部分にこっそりとvirtualを足しておきましょう。

 しかし注目すべきは返す内容。1を引き忘れてはいけません。引き忘れた場合、最後に0を置く枠が保証されなくなります。ここで1を引きたくない拘りを持つ方々は、テンプレート引数の方に1を足しておきましょう。概ね同じことができます。

 

 次に、各処理の書き換えです。Clear、Add、Insert、Removeが該当しますが、全て工程は同じです。各処理の後に、末尾に0を置く処理を追加します。

 では、分かりやすいClearから。

こうなります。元の処理を行い、末尾に0を置きます。

 継承の基本ではありますが、C++では(staticはともかくとして)クラス名にコロン2つを付けてメソッドを呼び出すと、基底クラスにある処理を呼び出すことができます。これを付け忘れると、ずっと継承先のClearを呼び続ける再帰の無限ループに陥ります。

 

 さて、次はAddなのですが――

――Clearとは違い、if文がありますね。追加の成功時にのみ末尾に0を置いています。まさかとは思いますが、if文アンチの方々がいらっしゃるなら、どうぞ分岐せずに0を置いてください。

 

 残るはInsert及びRemoveですが――

――コピペです。普通にコピペの方が早いです。if文アンチの方々でもコピペで大丈夫です。タイピングに慣れておきたいという方々は打ち間違いに注意しつつ手打ちしましょう。

 

 

 ヨシ、これで完成……ではありません。文字列なので、C++に於ける文字列型であるcharのポインタ型として取り出せてこそ仕事を全うできます。

 では、如何にして作るのか。簡単です。

配列の先頭をポインタとして渡します。以上です。

 しかし、記号や括弧を省いて単にreturn obj;と書きたい人も居るでしょう。何故そう書いてはいけないのか……別に書いてもいいです。constであることも含め、私が宗教上の理由でこう書いているだけです。

 

 

 

 

 これにて、文字列クラスは完成です。頑固な部分を解すも良し、文字列に文字列を足すも良し、ネタにして宗教戦争を仕掛けるも良し。

 紙でも指は切れますし、蒟蒻ゼリーでも人は死にます。しかし、流石にこの内容を使って人を傷付けることはできないと思うので、完全にご自由にお使いください。

 

 

LucKee