導出(継承)と、仮想関数
先週頃より、電子情報以外の学科の学生さんは、 難しいのか参加しなくなってきた。 5名だけを相手の説明って何だか寂しいなぁ。
先週に説明した、導出の概念をもう一度説明した後、クラスの格下げにより できそうでできない処理の例を説明する。
class Syain { private: char name[10] ; int age ; public: Syain( char s[] , int a ) { strcpy( name , s ) ; age( a ) ; } void print() { printf( "%s %d" , name , age ) ; } } ; class Jyoshi : public Syain { private: Syain *buka[10] ; int size ; public: Jyoshi( char s[] , int a ) : Syain( s , a ) { size = 0 ; } } ; int main() { Syain a( "ひら1" , 24 ) ; Syain b( "ひら2" , 27 ) ; a.print() ; Jyoshi c( "部長" , 43 ) ; c.print() ; // 継承により、OK Jyoshi d( "社長" , 59 ) ; c.add( &a ) ; c.add( &b ) ; // cの部下の追加 d.add( &c ) ; // c は Syain に格下げされて追加された。 Syain e( "ひら3" , 33 ) ; d.buka[0]->add( &e ) ; // ☆NG: buka[0] は c:Jyoshi だけど、 return 0 ; // 格下げされているので add を実行できない。 }
上記の例の解決策の方向性として、仮想関数の話しを行う。 最初に、C 言語の共有体(union)を用いて、1つの配列に異なる型を入れるテクニック を紹介し、型識別番号と分岐処理の手間を説明する。 この問題の解決策として以下のような仮想関数を利用した事例を紹介。
class Data { public: virtual void print() = 0 ; } ; class Int : public Data { private: int x ; public: Int( int a ) : x( a ) {} virtual void print() { printf( "%d" , x ) ; } } ; class Double : public Data { private: double y ; public: Double( double a ) : y( a ) {} virtual void print() { printf( "%f" , y ) ; } } ; class String : public Data { private: char s[ 10 ] ; public: String( char*a ) { strcpy( s , a ) ; } virtual void print() { printf( "%s" , s ) ; } } ; int main() { Int a( 123 ) ; Double b( 1.234 ) ; String c( "ABC" ) ; Data* array[3] ; array[0] = &a ; // 仮想関数でなければ、クラスの格下げが発生している array[1] = &b ; array[2] = &c ; for( int i = 0 ; i < 3 ; i++ ) // 仮想関数の呼び出し array[i]->print() ; // 異なる型が混ざった配列でも OK return 0 ; }
仮想関数と継承の考え方の応用事例として、コンテナクラスなどの便利な機能が 実現できることや、C++ では template によるコンテナクラスの事例が多いので、 以下の template 文の事例を紹介する。
template swap( T* a , T* b ) { T c = *a ; *a = *b ; *b = c ; } void main() { int a = 123 , b = 234 ; float c = 1.234 , d = 2.345 ; swap( &a , &b ) ; swap( &c , &d ) ; }
課題の作成とリスト構造導入
センター端末室で、malloc,free を使った可変長配列としての利用の 課題に取り組んでもらう。テストも近いし、リスト構造の導入説明も行う。
『配列の問題点として、途中へのデータ挿入処理が O(N) アルゴリズムであり、 効率が悪いので、解決策は?』という導入より、 配列の添字によるリスト構造を説明し、挿入処理が一定時間で実現できる点を説明。
malloc+free
先週の説明後半で簡単に紹介した malloc + free の説明を繰り返す。 メモリーリークの問題やヒープメモリはプロセス終了時に回収される点の説明を行う。 プログラム例として、文字列をheapに記憶する処理を示す。 来週は、センターにて課題に取り組む予定。 課題は、配列サイズや文字列長サイズが不定であることを想定して、 データの入出力を行うプログラムを作ること。
時間が余ったので、C++ での new,delete の事例も紹介する。
価格.com の攻撃は SQL インジェクション
授業の雑談ネタとしてはタイムリーなので、どこかで使おう。 でも、asahi.com の記事の、 『コンピューターの基本ソフト(OS)などの欠陥を突いて侵入する通常のサイト攻撃とは違い、ソフトの不備ではなく、データベースの安全設定が不十分だった点を悪用された。』 って書いてあるけど、SQL インジェクションのどこが 『ソフトの不備でない』 のかが不思議だ。
課題プログラムの作成
プログラム作成の課題に取り組む。 何進数かの文字で記載されたデータを数値化する、 数値データを何進数かの文字列に変換する、というテーマで、 『何進数』は自分で任意に選ぶこととする。
課題中の説明で、#include の意味等を紹介。
学内書類審査の資料作り
5/30提出のプロコン書類のための、5/27実施の学内審査のための書類作成 (準備)に取り掛かってもらう。 下條先生の協力により、2限目のシステム設計の時間の後半にて、 書類作成の際の注意点を説明する。 法を紹介する。
予告サボり
とある授業にて学生さん2名程が『○○先生の授業さぼりまーす!』 と通りがけに伝えてくる。 話を聞くと、 『授業進度が速く「ゆっくり説明して!」と頼んでも進んでいく。 このまま授業を聞いても判らないので、△△先生の所で教えてもらう…』 という状況らしい。 学生の理解度を考慮しない講義も心配だけど、 自主的に先生に聞きにいくという点では、『極めて積極性がある』と思う。 ということで、連続でサボるのは困るけど 今日は『学生にサボるな!』と小言を言うのは、ひとまず不粋と思う。 『がんばって△△先生の所で勉強してね…』
進路指導委員会にて
進路指導委員会にて、5年の就職戦線の状況報告があった。 GW 前に1次面接といった学生が増えている様子。 一時期より1月ほど就職時期が前倒しになっているみたい。
大学編入希望者で過去問題が欲しい場合は、 大学から集めた問題を図書館にて保管しているので、閲覧して欲しい。 また、図書館に無い大学については、 教務係に依頼すれば取り寄せ をしてくれる。
パスワード変更
学生さん相手に、サーバのセッティングのお手伝い。 ただ、途中で通常画面で、パスワードが見えるようなタイプミスをしてしまう。 最近、パスワードの変更をしていなかったし、 良い機会なので、同一パスワードを使っていた物を全面変更する。