Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C言語でオブジェクト指向プログラミング / object-oriented-in-c

248b3a861850209cf980a47dc1d5f3f2?s=47 kazto
August 02, 2019

C言語でオブジェクト指向プログラミング / object-oriented-in-c

2019/8/2 吉祥寺.pm にて、C言語でオブジェクト指向プログラミングできるんですよ、というご紹介をしました。

248b3a861850209cf980a47dc1d5f3f2?s=128

kazto

August 02, 2019
Tweet

Transcript

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

  2. 一句

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

  4. 技書博 お疲れ様 でした!

  5. 自己紹介 • なまえ ◦ kazto(かずと) • しょくれき ◦ 組み込み系SIerで16年半 ◦

    社員数5人のWebベンチャーに半年 ◦ 2019年7月から、クーコム株式会社にJoin! ◦ 採用もやっていき! • しゅみ ◦ HR/HM鑑賞
  6. We Are Hiring!

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

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

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

  10. おしながき • オブジェクト指向ってなんだったっけ? • え?C言語? • クラス ◦ コンストラクタ・デストラクタ •

    メソッド • 継承とカプセル化
  11. オブジェクト指向ってなんだったっけ? • よく言われるのは ◦ 継承、多態性、カプセル化

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

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

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

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

  16. では、どうするか? • 「運用でカバー」します(いやホントに) • クラス≒構造体 • 命名規則で、private、protectedを分類する ◦ それらの関数は、「呼ばない」 •

    コンストラクタ・デストラクタは普通の関数 ◦ 自分で呼ぶ
  17. クラス=struct • 当然、C言語にはクラスという文法は無い (二回目) • 構造体を用いて、クラスを表現する • 当然、privateやprotectedなメソッドは作成でき ない。すべてpublicとなる

  18. よくある動物クラスの例 typedef struct classAnimal { enumAnimalType type; funcSay say; }

    classAnimal; typedef struct classDog { classAnimal base; funcRun run; } classDog; typedef struct classBird { classAnimal base; funcFly fly; } classBird;
  19. コンストラクタ・デストラクタ • コンストラクタ・デストラクタは、普通の関数として 宣言する • 手動でコンストラクタ・デストラクタ関数を呼んで、 メモリの確保・解放を行う ◦ コンストラクタ内で、オブジェクトにメソッドをセットする ◦

    メンバ変数に別のオブジェクトを持つなら、さらにそのコンストラクタ役関数を呼 び、メモリを確保、初期化する
  20. コンストラクタ・デストラクタ 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; }
  21. コンストラクタ・デストラクタ #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); }
  22. メソッド • メンバ関数は、予め関数ポインタ型をtypedefして おき、コンストラクタ内でセットする • メソッドは、関数ポインタをtypedefすることで表 現する

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

    • 子クラス構造体メンバにアクセスしたい時は、子クラス構造体にキャストする 継承とカプセル化
  24. Child 継承とカプセル化 Parent Parent キャストして隠蔽 キャストして 子要素にアクセス

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

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

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