ストラウストラップのプログラミング入門(25) 16章「GUI」

ストラウストラップのプログラミング入門』を読む。今日は第16章「GUI」。12章から始まったグラフィックス話の最後の章です。

ウィンドウにボタンやテキストボックスなどのウィジェットを貼り付ける話や、コールバックの説明が登場します。

それにしても、「next関数がどのように呼び出されるのかを理解してしまえば、GUIインターフェイスを持つプログラムですべてのアクションを処理する方法がわかったも同然である」というのは凄い。初心者を励ますにしても煽り過ぎ。だんだん著者が好きになってきました :-P

読書メモ

コールバック関数をなぜstaticメンバ関数にするのか

通常、画面の入出力を司るコードは、C言語だったり、それに類するナニカだったりと、低レイヤーの言語である場合が多いです。そこへは当然、C++のクラスという高級な言語機能を持ち込むことができません。

そのため、画面のイベント発生後に実行されるコールバック関数は、様々な言語のシステムから呼び出せるように、staticメンバ関数にする、とのことです。

しかし、クラスの概念を避けたいだけなら、メンバ関数にする必然性はなく、単にクラスに属さない関数にしておけばよいのでは?と疑問に思いました。

某方面に質問したところ、「それでもよいといえばよいが、名前空間を分けるために、メンバ関数にすることが望ましい」という意見をもらいました(ありがとうございます)。たしかに、クラスに所属させておけば、長い名前を付けなくても済みますね。

…かつ、名前空間を扱うための他の機構(namespace)よりも、クラスを使った方が分かりやすいから、という話も、もしかしてあるのでしょうか。

名前衝突って、結構煩わしい問題なんですね。今の段階では実感がありませんが。

コールバックという機構をコードレイヤーで分割する

16章のコードでは、「システム上でGUIのコールバックを実現する関数」と、「実際にコールバックで実行させたい処理を行う関数」とを、分けて記述します。

ここで2つの関数を使用する根本的な理由は、関数は論理的なアクションを1つだけ実行すべきであるという原則にある。

しかし、たとえば、jQueryだと、コールバックをこういう粒度では書きません(よね?)。論理的なアクションの単位とは、そのプログラミング言語がシステムのレイヤーをどのように扱うかによって、決定されるのであろう、と思いました。

ポインタはこのあとすぐ! すていちゅーーん

…らしい。reference_toとか出てきたけど、このあたりの話は17、18章に先送りされており、「今は気にするな」などといわれます。ハイ。

混乱した箇所

異なる型の戻り値を持つ同名のメンバ関数を定義できるなんて・・・どういうことなの・・・。理解を保留しました。

ドリル

ラインを描画する簡単なGUIアプリに、ラインスタイルを選択するメニューを追加します。

本文の写経+αくらいでしたが、一応。

16章で第2部「入力と出力」はおしまいです。