Slide 1

Slide 1 text

C言語で オブジェクト指向 プログラミング 2019/8/2 吉祥寺.pm kazto

Slide 2

Slide 2 text

一句

Slide 3

Slide 3 text

PCの 電源切れて 冷や汗なう

Slide 4

Slide 4 text

技書博 お疲れ様 でした!

Slide 5

Slide 5 text

自己紹介 ● なまえ ○ kazto(かずと) ● しょくれき ○ 組み込み系SIerで16年半 ○ 社員数5人のWebベンチャーに半年 ○ 2019年7月から、クーコム株式会社にJoin! ○ 採用もやっていき! ● しゅみ ○ HR/HM鑑賞

Slide 6

Slide 6 text

We Are Hiring!

Slide 7

Slide 7 text

C言語で オブジェクト指向 プログラミング

Slide 8

Slide 8 text

Perlとオブジェクト指向 あとづけ→(昔は)無かった C言語→もともと無かった

Slide 9

Slide 9 text

PerlとC Perlは(ほぼ) C言語で書かれている

Slide 10

Slide 10 text

おしながき ● オブジェクト指向ってなんだったっけ? ● え?C言語? ● クラス ○ コンストラクタ・デストラクタ ● メソッド ● 継承とカプセル化

Slide 11

Slide 11 text

オブジェクト指向ってなんだったっけ? ● よく言われるのは ○ 継承、多態性、カプセル化

Slide 12

Slide 12 text

オブジェクト指向ってなんだったっけ? ● Wikipediaによると(アラン・ケイ) ○ メッセージング ○ ローカルな記憶保持と保護と実行状態 の隠蔽 ○ 徹底的な遅延バインディング

Slide 13

Slide 13 text

オブジェクト指向ってなんだったっけ?

Slide 14

Slide 14 text

オブジェクト指向ってなんだったっけ? 今回は継承、多態性、カプセル 化、で進めさせて下さい。 m(_ _)m

Slide 15

Slide 15 text

え?C言語!? ● C言語は、手続き型プログラミング言語 ○ クラスという文法は存在しません ○ private、protectedというキーワードはありません ○ コンストラクタ、デストラクタという機構もありません

Slide 16

Slide 16 text

では、どうするか? ● 「運用でカバー」します(いやホントに) ● クラス≒構造体 ● 命名規則で、private、protectedを分類する ○ それらの関数は、「呼ばない」 ● コンストラクタ・デストラクタは普通の関数 ○ 自分で呼ぶ

Slide 17

Slide 17 text

クラス=struct ● 当然、C言語にはクラスという文法は無い (二回目) ● 構造体を用いて、クラスを表現する ● 当然、privateやprotectedなメソッドは作成でき ない。すべてpublicとなる

Slide 18

Slide 18 text

よくある動物クラスの例 typedef struct classAnimal { enumAnimalType type; funcSay say; } classAnimal; typedef struct classDog { classAnimal base; funcRun run; } classDog; typedef struct classBird { classAnimal base; funcFly fly; } classBird;

Slide 19

Slide 19 text

コンストラクタ・デストラクタ ● コンストラクタ・デストラクタは、普通の関数として 宣言する ● 手動でコンストラクタ・デストラクタ関数を呼んで、 メモリの確保・解放を行う ○ コンストラクタ内で、オブジェクトにメソッドをセットする ○ メンバ変数に別のオブジェクトを持つなら、さらにそのコンストラクタ役関数を呼 び、メモリを確保、初期化する

Slide 20

Slide 20 text

コンストラクタ・デストラクタ void ctorClassAnimal(classAnimal *this, enumAnimalType type, funcSay *say) { this->type = type; this->funcSay = say; } void ctorClassDog(classDog *this) { ctorClassAnimal((classAnimal *)this, enumAnimalTypeDog, funcBark); this->funcRun = funcRun; } classDog * newClassDog() { classDog *ptr = (classDog *)malloc(sizeof(classDog)); if(ptr) { ctorClassDog(ptr); } return ptr; }

Slide 21

Slide 21 text

コンストラクタ・デストラクタ #include ”animal.h” #include ”dog.h” int main(void) { classAnimal *dog = NULL; dog = (classAnimal *)newClassDog(); dog->funcSay(dog); return 0; } void funcBark(classAnimal *this) { printf(”%d: Bow Wow!!”, this->type); }

Slide 22

Slide 22 text

メソッド ● メンバ関数は、予め関数ポインタ型をtypedefして おき、コンストラクタ内でセットする ● メソッドは、関数ポインタをtypedefすることで表 現する

Slide 23

Slide 23 text

● 当然、クラスの継承を行う文法も、無い ● 親クラス構造体を、子クラスのメンバの一番目に宣言する ○ 一番目であることが重要 ○ キャストしたときに、親オブジェクトと子オブジェクトが同じアドレスを指す ● 親クラス構造体にキャストすることで、子クラス構造体のメンバは隠ぺいされる ● 子クラス構造体メンバにアクセスしたい時は、子クラス構造体にキャストする 継承とカプセル化

Slide 24

Slide 24 text

Child 継承とカプセル化 Parent Parent キャストして隠蔽 キャストして 子要素にアクセス

Slide 25

Slide 25 text

いかがでしたでしょうか? ● C言語であってもオブジェクト指向に寄せた設計を 行うことで、より体系だった開発を行うことができ ます

Slide 26

Slide 26 text

技術書典7、待ってろよ!!(震え声

Slide 27

Slide 27 text

We Are Hiring! 大事なことなので2回 弊社はC言語まったく使いません!!