C 十十 プログラミング 入門 0 れます。 InterViewsC' は , オプジェクトへ の操作や処理の集合をまとめて , 通信プロ トコル ( あるいはたんにプロトコル ) と呼び ます。ここては , 各オプジェクトに定義さ れた通信プロトコルについて解説します。 teracto 「の通信プロトコルには , List5 に 示すようなものがあります。操作 D 「 aw は , lnteractor を描画し , 操作 Resize は te 「 acto 「の大きさの変更処理を行います。 te 「 acto 「へのイベント処理関係ては , 操作 Read が待ち行列からイベントを取り出し , 操作 Handle が処理します。これらのプロトコル は , lnteractor クラスから派生したクラスに も受け継がれ , InterViews のすべてのオプ ジェクトは , これらの操作については共通 のインタフェイスをもっことになります。 Scene のプロトコルて、は , さらに List6 の ようないくっかの操作が追加されています。 scene の構成要素としての旧 te 「 actO 「オプジ ェクトは , 操作 se 「 t や Remove て、指定しま す 0Tray や Deck などのオプジェクトて、の構 成要素の順序は , 操作 Raise や Lower< 変更 します。 同様に Graphic や Text, さらに派生した Picture や Clause にも , 追加されたプロトコ ルがあります。たとえば ,Graphic には , List7 のような図形の移動 , 回転 , 拡大 , 縮小の ためなどの操作が追加され , CIause には , List8 のようなテキストの挿入や置換のため などの操作が追加されています。 このように , . クラスの派生により , 必要 に応じて新しいプロトコルが追加されます。 プロトコルのほとんどは仮想関数て、あるた め , 統一的な取り扱いを保ったまま新しい 処理に置き換え , 動的束縛を使った処理の 選択を利用することもてきます。なお , れらのプロトコルの具体的な使用法は , 次 のプログラム例を参考にしてください ■プログラム例 さて , ここ <InterViews を使って , プロ グラムを作成してみます。まず , List9 に簡 単な例を示します。ウインドウの土台とな 94 CMAGAZINE 19 7 List 9 24 : main(int argc, char* argvC]) { / / ウインドウの基礎となる Wor ld オプジェクトを生成している。 25 : 〃同時に , コマンド行のオプションも解析している。 26 : new World("gomil", ps, OS, argc, argv); 27 : World* kumi 28 : / / メッセージ本体である Message オプジェクトを生成している。 = new Message(" SOFTBANK C MAGAZINE 30 : Message* m / / 表示しようとするオプジェクトを World オプジェクトに挿入する。 32 : kumi->lnsert(m) : 33 : 34 : / / イベント待ち 35 : kumi->Run() : 36 : 旧 te Ⅳ iews のプログラム例 2 List 1 0 2 : * * プログラム gom i 1. cc の文字列にスクローラをかぶせたプログラム (gom i 2. cc) 3 : 4 : 5 : / / InterViews のヘッダファイルの読み込み 6 : #include く InterViews/defs. h> / / InterViews ワールドの構築のための定義。 7 : 8 : #include <InterViews/border. h> / / Border オプジェクトの定義。 9 : #include く InterViews/box. h> / / Box オプジェクトの定義。 10 : #include く InterViews/message. h> / / Message オプジェクトの定義。 11 : #include く InterViews/scrolIer. h> / / Scroller オプジェクトの定義。 12 : #include く InterViews/viewport. h> / / Viewport オプジェクトの定義。 13 : #include く InterViews/worId. h> / / World オプジェクトの定義。 14 : 15 : / / このプログラムは , スクローラ ( スクロールバー ) により , 一部分だけを表示する 16 : / / ような文字列のウインドウを生成するものである。 InterViews TooIkit では , 17 : / / テキストやグラフィックスまでオプジェクトとして管理するため , このようなこ 18 : / / とは容易に可能である。 20 : / / リソース情報の指定にこでは , フォントの種類を指定している ) 。 21 : static PropertyData ps[] {"*font" 22 : -*-heIvetica-boId-r-normaI--34-*"}, { n i I } 23 : 24 : } : 25 : / / プログラム個有の追加オプションの情報の ( なし ) 記述。 26 : static 0ptionDesc os ロ 28 : / / ただの ma i n 関数 VO i d 29 : main(int argc, char* argv ロ ) { / / ウインドウの基礎となる Wor ld オプジェクトを生成している。 30 : / / 同時に , コマンド行のオプションも解析している。 32 : World* kumi ニ new WorId( ” gomi2" ps, OS, argc, arg の : 33 : / / メッセージ本体である Message オプジェクトを生成している。 34 : 35 : Message* ニ new Message(" SOFTBANK C MAGAZINE 36 : / / 生成した Message オプジェクトにスクローラをかぶせ , その一部 / / だけを表示できるようにする。 38 : / / まず , Message オプジェクトを構成要素の一部だけを表示する , 39 : / / V i ewport オプジェクトに挿入する。 40 : Viewport* d = new Viewport(m) : / / つぎに , それに対し , スクローラを付ける。 42 : ニ new VBox (), new HBorder, new HScroller(d)) : 43 : BOX* C 44 : / / 表示しようとするオプジェクトを World オプジェクトに挿入する。 45 : kumi->lnsert(c) : 46 : / / イベント待ち 48 : 49 : kumi->Run() :
るオプジェクトを生成し , それに , 必要な オプジェクトを積め込み , 配置します。 れらの処理は , C 十十の言語仕様により , ス マートに記述され , オプジェクトの生成に はコンストラクタが , 積め込みにはメンバ 関数 inse 「 t が使われています。 さらに , 先ほどの例にスクローラ ( スクロール ー ) を加えたものを List10 に示します。 プログラムの変更箇所はわずかてすが , 実際 の領域の一部だけをウインドウ内部に表示 するように簡単にてきます。これらふたっ のプログラムの実行結果を Fig. 5 に示します また , InterViews には , いくっかのアプ リケーションプログラムがついてきます。 そのひとつお絵書きプログラム idraw ( Fig. 6 ) は ,Macintosh のようなユーザインタフェイ スをもち , データは PostScript の情報として 保存されます。そのため , それを PostScript プリンタに送るだけて , デバイスの解像度 によらない出力が得られます。そのほかに は , 計算機の情報を表示する istat , デジタル 時計の dclock, さらに InterViews のウイン ドウマネージャの iwm などがあります。 ■そのほか ドキュメントとしては , 参考文献 [ 4 ] [ 5 ] [ 6 ] の InterViews についての 3 つの論文 ( 40 ページ強 ) , release note, changes ( 前のリ リースからの変更箇所のまとめ ) があり , そ のほかに , ライプラリとアプリケーション プログラムのそれぞれに , マニュアルペー ジが付属しています。ドキュメント自体は 膨大てはありませんが , 筆者にも , あまり 苦労せずに , この InterViews を理解するこ とてき , プログラムを作成てきるようにな りました。それも , このツールキットがわ かりやすい構造になっているためだと思わ れます ( 注 22 ) 。ぜひとも , 一度 InterViews を 試してみることをおすすめします。 注 22 なお , InterViews は十う野吏いものになるツールキ ットてある。たとえば , 本連載の図のほとんどは , 付属 のプログラム idraw を使って作成した。著者も , lnter View ) 恩恵をあずかっているひとりてある。 Fig. 5 List 9 ( 上 ) , List 1 0 ( 下 ) の実行画面 SOFTBANK - C MAGAZINE NK - C MAGA Fig. 6 お絵書きソフト id 「 aw 0 1 Edt Stn.E 記 Fmt 師ね t ー一一 2 ・ 14 Select S \ 1 0 ロ 0 0 C 十十プログラミング入門 95
歴 ( 注 18 ) の日付を , Time は 1 日の時間を表現 します。クラス LookupKey は , コレクショ ンの探索に使われるキーを表現します。 ほかにも似た , つまり , ふたつのインスタ ンスを数量的に比較て、きるという性質をも つものに , クラス lnteger, Fraction ( 注 19 ) 日 oat などがあります。これらは , libg 十十 に同様なクラスがあったため , ここて、は省 略します。 ・ Process, ScheduIer, Semaphore など NIHCI には , コルーチンスタイルのマル チプログラミングを可能にするためのクラ ス群が用意されています。クラス Process は , 独立な , つまり , ほかの P 「 ocess に影響 されない順次の動作を表現します。クラス Scheduler は , この P 「 ocess を順序に ( 優先度 に応じて ) , 一定時間ごとに実行させます。 P 「 ocess 間の同期を取ることも可能てあり , その機能はクラス Semaph0 「 e て提供されて います。 さらに , Semaphore の機能を補うために クラス SharedQueue があります。これによ り , P 「 ocess 間通信は , より確実なものにな ると思われます。 なお , クラス Process には , スタック領域 をどこに取るかて、 , ふたつの派生クラス , HeapProc と StackProc があり , 前者は自由 記憶領域に , 後者は関数 main のスタック領 域に配置されます。 また , NIHCL のクラスのインスタンスを ファイルにつめこんだり , 取り出したりす るために , いくつかのクラスが用意されて います。人出力のファイル記述子としては クラス 0 ℃ if , 090fd があり , 入出力ストリ ームとしてはクラス OIOistreamin, 0 ℃ os tream があります。これらの入出力ストリー ムは AT & T や libg 十十のクラス St 「 eam に似 たものてす。また , これらに , クラスのイ ンスタンスごとの入出力インタフェイスを 追加したのが , クラス OlOnihin, OIOnihout て , 入出力関数「 eadF 「 om , sto 「 eOn て使わ れるテープル ( 表 ) のクラスが ReadFromT bl, StoreOnTbl-C す。 ・そのほか 付属するドキュメントは , インストール 方法と古いリリースとの違いが書かれたリ リースノートとが ( A4 て ) 合計 20 ページ強あ ります。 これだけて、は , ほとんどわからないため , ソースコードを見ることになりますが , ちらにもあまりコメントがないため , 理解 するにはけっこう苦労します。なお , この クラスライプラリについて書かれた書籍 (Gorlen, K. , OrIow, S. and PIexico, P. , TData Abstruction and Object-Ori ented Programming in C 十十』 , JOhn Wiley and Sons, 1990 ) が出版されている ようなのて , それを読めば , もっと容易に 理解て、きるかもしれません。 , ほかの環境への移植は , コードが UNIX て、の動作を前提に書かれているように 見えるのて難しいと思います ( ただ , 機械に 依存する部分はまとめられているため , UNIX が動作する環境なら , 移植はしやすいて、し よう ) 。 先月号の X Window System の紹介の際 に , そのプログラミングインタフェイスの ひとってある X TooIkit を使った簡単なプロ グラム作成例を示しました。 X Toolkit は , 抽象的な部品を組み合わせ , アプリケーシ ョンを構築するオプジェクト指向の開発支 援ツールて、した。 そして , オプジェクト指向の記述がより 容易にてきる C 十十による X Toolkit を実装 した例が , ここて紹介する InterViews (lnter active Views) てす。 InterViews は Stanford 大学の Mark A. Linton 氏らにより開発され , 公開されてい ます。 X11R3 や X11R4 の配布テープや FSF のべータテストテープにも含まれています から , 比較的容易に入手てきるてしよう。 現在の最新バージョンは 2.6 てあり , このバ ージョンは g 十十てもコンパイルてきます。 ロ InterViews ー InterViews ツールキットの特長 InterViews は , ワークステーション環境 て , 柔軟なユーザインタフェイスの容易な 構築を目標に開発されました。現バージョ ンは C 十十て記述され , X Window System 上のツールキットとして動作します。 lnter Views は , ツールキットすべてが C 十十の機 能を活かすように新たに設計されているた め , X TooIkit lntrinsics などは利用せず , 代わりに C 十十の文法 , つまりコンストラク タやメンバ関数を使い , ユーザインタフェ イスが構築されています。ウインドウシス テムにはオプジェクト指向という考え方が 効果的て、ある , といわれていますが , て、の C 十十の利用も , このツールキットを X Toolkit lntrinsics に比べ , たいへんわかり やすいものにしています。 ューザインタフェイスの構築は , インタ フェイスの部品てあるオプジェクト ( 注 20 ) を 組み合わせることて進められます。 Athena Widget などて、は , スクロールノヾーやメニュ ーまてしか部品としなかったのに対し , lnter Views ては文字 , 語句 , 空白などのテキスト や円や曲線などの図形まても部品として扱 っています。このため , Athena WidgetC 弱いといわれていたグラフィックス関係も 強力てあり , 文字も含めて , 細かなレイア ウト指定がてきるようになっています。 れも , InterViews の特長のひとってす。 ークラスの階層構造 InterViews のオプジェクトのクラスは , 4 つに大別てきます。それらの階層構造の主 要な部分を図示すれば , Fig. 4 のようになり ます。図からもわかるように , それぞれの クラス階層は浅いものに , そして , クラス 注 18 SamIItaIk ー 8(). ) システムクラス Date は , ュリウ ス歴の日イ、けごそうだ。 注 1 9 有理数てあるが , libg 十十の名前は , Rational だ った。 注 20 InterViews のオプジェクトは , X TooIkit lntrinsics< の Widget, つまりツールキットの部品に相 当するものて , C 十十のクラスを使って定義されます。 C 十十プログラミング入門 91
VO i d VO i d VO i d VOid VO i d VO i d VO i d lnteractor オプジェクトへの通信プロトコル List 5 = 0. の ; Draw(void) : Redraw (Coord I eft, Coord botton, Coord right, Coord top) : Read (Event&) ; HandIe(Event&) : Update(void) : Reshape (Shape&) : Resize(void) : Scene オプジェクトへの通信プロトコル List 6 I nsert (I nteractor*) : Remove (I nteractor*) : Raise(Interactor*) : Lower(Interactor*) : Move(Interactor*, Coord x, Change 0 nteractor*) : Propagate ( b001 ean) : List 7 VO i d VO i d VO i d VO i d VO i d VO i d VO i d VO i d VO i d VO i d Coord y, AI igment) : Graphic オプジェクトへの通信プロトコル TransIate(float dx, float (y) : ScaIe(float sx, float sy, float crtx = 0.0 , float ctry Rotate(fIoat angle, float ctrx = 0.0 , float ctry = 0. の : List 8 Clause オプジェクトへの通信プロトコル れた Text オプジェクトの表示領域の定義を行 うオプジェクトになります。さらに , Text に は , W 0 「 d , W h i t e S p a c e , C u s e , Sentance, paragraph, Display などの派生 クラスがあります。 Wo 「 d は文字列を表現す る Text オプジェクトになり , Clause や Sen- tence は , 複数のテキストオプジェクトの集 のメンバ関数やフレンド関数により定義さ オプジェクトへの操作や処理は , クラス ・オプジェクトの通信プロトコル す。 クトの集まりを扱うオプジェクトになりま なり , Picture は , 複数の G 「 aphics オプジェ ン曲線を表現する G 「 aphics オプジェクトに スがあり , Point や SpIine は , 点やスプライ EIlipse, Polygon, Picture などの派生クラ L i n e , C i 「 c , R e c t a n g , S P ⅱ n e , ラスて、す。さらに , G 「 aphic には , P0int, 表現されたイメージの修復を行うためのク り , Damage は , Graphics オプジェクトて の Graphics オプジェクトの基底クラスて、あ Graphic などがあります。 Graphic は , 多数 Damage, GraphicBlock, Persistent, 一方 , グラフィック関係のクラスには , ります。 まりを扱う (Composition) オプジェクトにな ました。つまり , ウインドウに文字が表示 されていても , その文字は , それを表示し ている widget が管理しているのて、あり , 文 字が自分自身を管理しているのて、はありま せんてした。ゆえに , 移動 , 拡大 , 縮小 , 再描画などの操作は , 表示している widget が個別にめんどうを見てやらなければなら なかったのてす。 InterViews< は , テキストやグラフィッ クをオプジェクトにすることて , 文字や曲 線に対する操作を , 文字などそれ自身に任 せています。したがって , 文字を表示する 場合ても , 個々の操作は文字自身に任せら れるため , それを表示している widget は , そういった厄介な処理まてめんどうを見な いてすみ , widget の作成はずいぶん楽にな ります。 テキスト関係のクラスには , Layout, StringEdit, TextBIock, TextViewer, Text void InsertAfter(Text* 01d , Text*) ; void InsertBefore(Text* OId, Text*) : void RepIace(Text* old, Text*) : などがあります 0Text は ,Text オプジェクト の基底クラスて、あり , Layout は , まとめら 旧 te Ⅳ iews のプログラム例 1 List 9 2 : 3 : 4 : 7 : 9 : 16 : 21 : 22 : 23 : static OptionDesc OS[] 20 : / / プログラム個有の追加オプションの情報の ( なし ) 記述。 { nil } -*-heIvetica-b01d-r-normal--34-*"}, {"*font" static PropertyData ps[] 15 : / / リソース情報の指定にこでは , フォントの種類を指定している ) 。 13 : / / うことができる。 * * 文字列を単に表示するだけのプログラム (gom i 1. cc) 5 : / / InterV i ews のヘッダファイルの読み込み / / I nterV i e ws ワールドの構築のための定義。 6 : #include く InterViews/defs. h 〉 8 : #include く InterViews/message. h> / / Message オプジェクトの定義。 〃 World オプジェクトの定義。 #include <InterViews/world. h> 1 1 : / / このプログラムは , 単に表示するだけのものである。この例では , メッセージ 12 : / / というオプジェクトを使ったが , 円とかスプライン曲線でもほぼ同じように扱 V 0 i d / / ただの ma i n 関数 0 C 十十プログラミング入門 93
C 十十 プログラミング 入門 のほうが大きいと思います。 また , g 十十には , 先に紹介した libg 十十 があるのも大きな特長て、す。なお , gcc と g 十十 についてさらに , 本号の吉田氏の記事も参 考にしてください ・ C 十十 3.0 C 十十 3.0 の仕様は , まだはっきりしてい ません。しかし , 参考文献 [ 2 ] ても述べら れているように , パラメータつきクラス (Parametric CIass) と例外処理 (Excep tion Handling) が導入されることは , ほば まちがいないてしよう。前者のパラメータ 付クラスは , すてに紹介した ( 本連載第 3 回 参照 ) のて、 , ここては後者の例外処理を紹介 しましよう。 ・例外処理 まだ C 十十の例外処理の仕様は , パラメ ータ付クラスほど明確には決まっておらず , 参考文献 [ 2 ] ても詳細は解説されていませ ん。ゆえに , 以下に紹介するものが , すっ かり C 十十 3.0 て採用されるかどうかはわか りません ( 注 23 ) C + 十の例外処理機構は , 名前のとおり , プログラムの例外 , つまり , 数値演算の際 のオーパフロー ( あふれ ) , 配列の領域外の アクセス , NULL ( のての除算 , ヒープ領域 の不足などのアルゴリズムの記述とは関係 ない ( 本質的てない ) 処理を取り扱う標準的 な方法を提供し , パラメータ付クラスと同 じように , 大規模なライプラリの構築のた めには , 不可欠なものてす。 例外処理を考えましよう。 List11 に簡単な 例を示します。この例ては , 関数 oops て、例 外が発生するかもしれないとします。した がって , 関数の頭の部分て , 例外かどうか の検査をしています。もし例外だったら , 必要な情報を例外の型に詰め込み , th 「 ow 文 て投げ飛ばします。ここて , 情報を詰め込 んだ例外の型のオプジェクトは , List11 の先 頭にクラス oops ー tl , oops t2 として定義し 注 23 例の例外処理のプログラムは , 現時点ての最新の 情報をもとに作成しました。 98 CMAGAZINE 19 囲 7 てあります。 th 「 ow 文て投げ飛ばされた例外の型のオプ ジェクトを受け取り , 処理を行うのが , try 文と対になった catch 文群てす。 t 「 Y は , 例外 が発生しそうな部分をプロックとして囲み , そのブッロクて発生した例外を後続の catch が処理するのてす。 catch は , 例外の型ごと に用意され , それぞれ例外に対する適切な 処理が記述されます。 0 まとめ このように , C 十十は徐々に機能が追加さ れ , 大きな仕様をもった言語になろうとし ています。また , 言語の標準化も ANSI の X3 J16 委員会 (ANSI C 十十 ) て行われているよ うてす。ついに , C 十十も興味をもつ必要の ない言語になりそうてす。個人的には残念 てすが , C 十十も大衆の言語となってしまう のてしよう ( 本誌 18 頁参照 ) 。 ただ , すべての C プログラマが C 十十に移 行するかどうかは , まだわかりません。そ れは , C 十十の言語仕様が C に比べて , 複雑 なためてす。 C は , 高級アセンプラとも呼ば れ , 慣れた人なら , コンパイル後のコード をも意識したプログラミングが可能てす。 それは , ソースコードと機械語コードにあ る程度の対応があったからて、す ( つまり , 余 計なことをしない ) 。これは , 考え方によっ ては初心者にとっても理解しやすいわけて、 す ( 勝手に妙なことをされるよりは ) 。しか し , C 十十は , 多機能ゆえに , 処理系が勝手 にさまざまな処理を行います。たとえば , 派生クラスのコンストラクタ呼び出しは , 勝手に基底クラスのものまて呼び出します し , メンバ関数ては , 暗黙の引数があった りします。それら , おせつかいなような処 理は C 十十には不可欠なものてすが , C 十十 の学習を始めたばかりの人は , それて、ずい ぶん頭を悩ませているように思います。そ ういう困難を乗り越えて , C 十十を使いこな し , 自分て、優れたクラスを設計し , 実装て、 きる人は , そう簡単には増加しないてしよ しかし , C 十十があまり使われないといっ ているのてはありません。 C 十十は , 多数の ューザに使われるてしよう。それは , て紹介した , 新たに追加された機能が , 大 規模なクラスライプラリの構築を指向した ものだからてす。つまり , libg 十十 , NIHCL, InterViews などのライプラリ , さ らに大きな , 優れたライプラリがたくさん 登場すれば , ューザはクラスを自分て、作成 せず , 既存のライプラリを使うことて , C 十十 を使うことがてきるわけてす。前にも述べ たように , C 十十を C よりわずかに優れた言 語として利用することは , そんなに難しい ことて、はありませんから , こうした C 十十の ューザはどんどん増えるてしよう。 参考文献 [ 1 ] Stroustrup, B. , 「 The C 十十 Pro gramming LanguageJ Addison-WesleY' 1986. [ 2 ] Limmpan, S. B. , 「 C 十十 Primer 』 Addison-WesIey, 1989. [ 3 ] Lea, D. , fUser's Guide t0 GNU C 十十 Library 』 Version1. 35.0 , FSF, 1989. [ 4 ] Linton, M. A. , Calder P. R. and Vlissides J. M. , TInterViews : A C 十十 Graphical lnterface T001kitJ ln Proc. USENIX C 十十 Workshop, 1987. [ 5 ] VIissides J . M . and Linton, M . A. , 「 Applying Object ー Oriented Design to Structured Graphics 』 InProc . USENIX C 十十 Conference, 1988. [ 6 ] Linton, M. A. , Vlissides J. M. and CaIderP. R . , fComposing User lnter faces with lnterViewsJ Computer, 1989.
C 十十 プログラミング 入門 の種類の数は少なめにされています。これ は , 無意味に分けられた多数のクラスと , それが構成する階層構造は , ューザをたん に混乱させ , なんらかの問題を引き起こす だけてあったという過去の教訓によるもの てす ( 注 21 ) 。つまり , 新たなクラスを作成す る代わりに , 既存のクラスに機能を追加す ることを選んだことになります。さらに あるプログラムては , フォントや色などの 情報は同じて、あることが多いため , lnter Views てはこれらの情報をリソースとして共 有することがて、きます。その共有の方法は , libg 十十のクラス String と似た方法が使われ ています。 ・旧 te 「 acto 「クラスと scene クラス te 「 actO 「オプジェクトと Scene オプジェ クトが , ふつう Athena Widget や HP (Hew Iett-Packard)Widget て、提供されている部 : 相当します。 lnteractor が Primitive widget て、 , Scene が Composition widget と いうわけて、す。 te 「 acto 「オプジェクトは , 独立した部ロ となる基本的なオプジェクトて、す。基本ク ラスは旧 te 「 acto 「て、 , それから派生したサプ クラスには , Adjuster, Banner, Border, Button, Menu, Message, Panner, Scroller などがあります。たとえば , Button はボタ ンオプジェクトになり , さらに Push Botton, RadioButton などの派生クラスがあ ります。 Scene オプジェクトは , ひとつ以 E の lnter actor オプジェクトを含み , 適切な配置 ( レイ アウト ) を行い , 結果の位置 , 大きさを制御 するオプジェクトて、す。基本クラスは Scene て、 , その派生クラスには , BOX, Deck, Frame, Control,Tray, Viewport, World が あります。たとえば , Box は , タイリングに 比較的凝ったプログラムを低レ ることがて、きたり , HP Widget の ImageEdit っており , よりレイアウトを行うオプジェクトになり , ベルな機能を使うことなしに , 容易に作成 widget は , ラスタイメージを表示し , その 修正がてきました。しかし , それら処理は , Tray は , オーバラッヒ。ングによりレイアウ て、きるようになっています。 トを行うオプジェクトになります。 各 widget が個別に処理を実装し , 行ってい X Toolkit lntrinsics て、は , テキストやグ ・ Text クラスと Graphics クラス ラフィックの扱いは , 特定の widget がもつ Text オプジェクトと Graphics オプジェク 機能のひとって、した。たとえば , Athena 注 21 InterViews の過去のバージョンは , オプジェクト が最大 12 レベルの階層があったらしい トの存在は , InterViews の大きな特長にな Widget の Label widget は , 文字列を表示す 92 CMAGAZINE 19 7 te Ⅳ iews のオプジェクトの階層構造 Fig. 4 Message VBorder BO 「 der HBorder Banne 「 Zoomer Mover Adjuster Scro 「 Buton Glue Reduær Enlarger Le 物部 Rightbhver UpMover Down %ver Push Button RadioButton CheckBox VSc 「 0 「 H 「 TextButton VGlue HGlue Box Deck MonoScene World Tray FileBrowser lnteractor TextEditor Scene Slider StringEditor StringEdit WorldView StringBrowser TextBlock TextViewer TextBuffer G raphicBIock Graphic PointObj 凵 neO 切 BoxObj MultiLineObj FilIPoIygonObj ObjectMan PColor PPattern PBrush PFont WhiteSpace CO m position Word EditWo rd Caret MenuBar HBox VBox Frame pan ner Dialog Control Shell Terminal TltleFrame ShowFrame ShadowFrame BorderFrame Margi nF 「 ame Stri ngChooser FileChoose 「 Menulte m Menu PulldownMenu PuIIrightMenu PopupMenu FuIIGraphic Picture lnstance Circle Fill Ellipse BSpline Polygon Fill Rect Label ロロロ EIIipse Line POint MultiLine Rect FillCircle CIosedSpIine FillPolygon FillSpIi ne Persistent Li ne Break Parag rapr Sente nce Display TextList Text
“回クラスライフラリなど C 十十プログラミンク入門小山裕司・正畠克俊 この連載もいよいよ最終回です。まず , いくつかのクラスライ プラリを紹介します。このクラスライプラリは C 十十が多数の ユーザに与える恩恵のひとつを示した好例であり , ユーサはそ れほど C 十十を熟知することなく , その優れた機能や資産を利 用できることを示しています。そして最後に , 最近の C 十十の 舌題を取り上げます。近い将来 C に代わるアプリケーション開 発言語となる C 十十の新しい機能などを考察します。 て、も , その恩恵を得ることがて、きるて、しよ などとともに FSF 社 (Free Software Foun dation lnc. ) 社から入手て、きます ( 注 3 ) 。ただ う。クラスライプラリをもった C 十十は , ま ークラスライプラリ さにある特定の用途のために特殊化された し , 現在の Ver. 1.36.1 はまだテスト段階て、 C, つまり , C の基本仕様に加え , 複素数 , あり , FSF からの配布て、はべータテストテ 文字列 , コレクション , べクトルなどの抽 ープに含まれています。 本連載ては , クラスの設計と実装を中心 象データ型が使え , コルーチンやウインド に , C 十十を解説してきましたが , そこて、考 ■ⅱ bg 十十クラスライプラリ ウシステムを扱う機能をもった C を使うだけ 察したような優れたクラスの作成はけっこ のことなのて、す ( 注 2 ) 。そして , 必要に , あ オプジェクト指向のプログラミング言語 う手間のかかる作業て、す。しかし , あらか るいは知識に応じ , C 十 + の C の拡張機能 ( 引 じめ作成したクラスのライプラリを利用て、 のひとつ Smalltalk ー 80 は , 豊富なクラスライ プラリをもっことて知られています ( 注 4 ) 数の規定値 , インライン関数 , 強力な型検 きれば , その手間は軽減されることてしょ 査など ) が使えるのて、す。さらに , クラスの その Sma Ⅱ talk ー 80 のシステムクラスは階層 こては , そのようなクラスライプラ 継承が自山に使えれば , 定義ずみのクラス 構造を有し , その階層木の根の部分には基 リをいくつか紹介します。 を容易に拡張て、きるて、しよう。 本となるクラス object があり , その階層木の こて、紹介するクラスライプラリは , GNU これらのクラスライプラリが , 似通った 一部を図示すると Fig. 1 のとおりてす。 C 十十ライプラリ ( 以下 libg 十十と呼ぶ ) , クラスを設計 , 実装し , それらについて頭 NIH クラスライプラリ (NIHCL), lnter さて , ここて、紹介する libg 十十は Smalltalk を悩ませる , 多数の C 十十プログラマの救い ー 80 のシステムクラスとは設計の方法が異な Views の 3 って、す。 libg 十十と NIHCL はスタ となり , ソースコードのないクラスのバグ ックやべクトルなどのデータ構造の抽象デ り , クラスは階層構造をもちません。つま によるムダな時間の浪費を防ぎ , より優れ ータ型を中心としたクラスライプラリて、 , り , libg 十十はそれぞれ独立したクラスが集 たアプリケーションプログラムが高い効率 InterViews は X Window System 上て、のポ て、生み出されることを期待しつつ , 以下に タンやスクロールバーなどのオプジェクト 注 1 特定の目的 ( たとえば , 商用や軍事目的など ) への使 用は禁止されているものもあるため , 使用の際には , ド これら 3 つを紹介することにします。 を実現する X TooIkit のひとって、す。 キュメントを十分参照のこと。 注 2 もはや , 複素数だけのために FORTRAN を , コル 特筆すべきことは , これらのクラスライ 凵 GNU C 十十ライプラリ ーチンだけのために Modula ー 2 を , そして , ウインドウ プラリがフリーて、あり , ソースコードが公 システムのために難解な X の Athena Widget セットを使 う必要はどこにもない libg 十十には GNU C 十十 ( 以下 g 十十と 開され , 誰もが自由に利用がてきることて、 注 3 Free Software Foundation lnc. 675 Massa す ( 注 1 ) 。 chusetts Avenue Cambridge MA, 0213 USA. 呼ぶ ) のためにクラスライプラリとユーティ ( 617 ) 876 ー 3296.gnu@prep.ai.mit.edu リティが用意されています。このライプラ このようなクラスライプラリを活用すれ 注 4 この豊 1 ・かっ , 標 4 材ヒされたクラスライプラリの 存在も Smalltalk-80Ø魅力のひとって、ある。 ば , 各ユーザは C 十十をそんなに熟知しない リは ,Doug Lea 氏らにより開発され , g 十十 84 CMAGAZINE 19 7