「C++再考」の訳注集8
    第10章 C++ここにあり

こんにちは。(かなり、そうとうおひさしぶりです。)
最近、本業が忙しくなって、なかなか更新できませんでした。この忙しさは当分続きそうなので、突然ですみませんが、このHPの更新は以後しばらくお休みとさせてください。もう少し先にいきたかったのですが、、、。


さて、第10章は第9章のやり方を全面的に改め、いよいよC++らしいコードを書いていきます。C++の強みは、とりあえず動くコードでも、将来の拡張を十分考えたコードでもどちらでも、書けるということです。そういう意味では第9章も「C++らしい」のですが、やはりなんと言っても、拡張可能な第10章こそ、真打というわけです。

第10章を読んでいて、気になるのは、displayという関数が、意外にわかりづらいということです。わかっちゃった人は、もちろん、問題ありません。そうでないという人のための訳注です。

教科書の順番と違いますが、とりあえず、ざっと全体を見てから、130ページのpadの定義を見てください。別に難しくないですね。「空白を表示する関数」です。この関数は、文字データがないときに、何もなしではなく、空白をいれるために使われます。同じページのString_Pic::displayは1行ずつ文字列を表示し、文字列の長さが規定の幅に達しない場合はpadで空白を入れる関数です。まあ、わかるのではないでしょうか。

次のページのFrame_Pic::displayがちょっと難しいですね。まず、最初にrowが範囲外の場合があります。これは何なんでしょう。これは複数の絵がつなげられたりフレームを付けられたり、またつなげられたりするうちに、内部に絵のないところができてしまうためです。たとえば、高さが違うふたつの絵にフレームを付けて水平方向につなげて新しい絵を作ると、もとの小さい方の絵の下に空きができますね。
この絵を表示するには132ページのHCat_Pic::displayが使われますが、実際の表示はHCatのメンバ変数であるleftとrightのdisplayに任されます。今の場合、どちらもフレーム付きとしたのでFrame_Pic::displayが使われるでしょう。そうしてdisplayは1行ずつ表示していくのですが、どちらか行数の少ない方の絵の行数を越えても、HCat_Pic::displayは、leftとright両方のFrame_Pic::displayを呼び出しつづけます。そのため、範囲外にでたら、空白を打出すようにしないといけないわけです。

少々わかりづらいですが、そう思えば、他のクラスのdisplayもみな、ちゃんとそのように範囲外では空白が表示されるように作られています。

このdisplayさえわかれば、後は、すっきりしたコードだと思うのですが、どうでしょうか。displayが複雑なのは、「絵」といいながらコンソールへの印字を考えていて、決して後戻りせずに1行ずつ印字するしかないからです。たとえばGUIで任意の場所に絵を表示できるのなら、もっとずっとすっきりするでしょう。しかし、残念ながら読者のみなさんのGUIシステムが何かわからないので、GUIは使わなかったのです。

もし、この章の論理だけみたいのなら、「displayとは絵を表示する関数である。heightとwidthは高さと幅を知らせてくれる関数である。」とだけ思って読んでみれば本質がわかると思います。


なお、ポインタのポインタ(char** dataなど)がよくわからないという質問があるのですが、123ページのコンストラクタ、デストラクタをよく見て使い方を覚えてください。コンストラクタの引数になにやらconstがたくさん入っていてびっくりしますが、これについて詳しく知りたい方は文法の教科書をみてください。文法をよく考えると、意外に難しい内容なのです。しかし、実際的な意味では、変更する気のないデータのポインタのポインタを引数にするときには、このようにするんだ、、、と思っておけばよいと思います。


132ページ真ん中のコードで

 if(row > 0; && row < top.height() )

とある、「;」は不要ですね。すみません、校正もれでした。

簡単ですが、これで第10章の訳注は終わりです。


中途ですが、はじめに書いたように、このHPの更新はしばらくお休み(無期延期?)とします。
ここまで付き合ってくださったみなさんありがとうございました。
「C++再考」への疑問点がありましたら、メールをくださるようお願いします。完全に答えられないこともあるかもしれませんが、まじめに考えてお応えしたいと思います。

私はHPを書いていてとても楽しかったです。みなさん、いままでありがとうございました。小林健一郎

前のページ
後のページ
訳注の目次
総目次