2019/8/2 吉祥寺.pm にて、C言語でオブジェクト指向プログラミングできるんですよ、というご紹介をしました。
C言語でオブジェクト指向プログラミング2019/8/2 吉祥寺.pmkazto
View Slide
一句
PCの電源切れて冷や汗なう
技書博お疲れ様でした!
自己紹介● なまえ○ kazto(かずと)● しょくれき○ 組み込み系SIerで16年半○ 社員数5人のWebベンチャーに半年○ 2019年7月から、クーコム株式会社にJoin!○ 採用もやっていき!● しゅみ○ HR/HM鑑賞
We Are Hiring!
C言語でオブジェクト指向プログラミング
Perlとオブジェクト指向あとづけ→(昔は)無かったC言語→もともと無かった
PerlとCPerlは(ほぼ)C言語で書かれている
おしながき● オブジェクト指向ってなんだったっけ?● え?C言語?● クラス○ コンストラクタ・デストラクタ● メソッド● 継承とカプセル化
オブジェクト指向ってなんだったっけ?● よく言われるのは○ 継承、多態性、カプセル化
オブジェクト指向ってなんだったっけ?● Wikipediaによると(アラン・ケイ)○ メッセージング○ ローカルな記憶保持と保護と実行状態の隠蔽○ 徹底的な遅延バインディング
オブジェクト指向ってなんだったっけ?
オブジェクト指向ってなんだったっけ?今回は継承、多態性、カプセル化、で進めさせて下さい。 m(__)m
え?C言語!?● C言語は、手続き型プログラミング言語○ クラスという文法は存在しません○ private、protectedというキーワードはありません○ コンストラクタ、デストラクタという機構もありません
では、どうするか?● 「運用でカバー」します(いやホントに)● クラス≒構造体● 命名規則で、private、protectedを分類する○ それらの関数は、「呼ばない」● コンストラクタ・デストラクタは普通の関数○ 自分で呼ぶ
クラス=struct● 当然、C言語にはクラスという文法は無い(二回目)● 構造体を用いて、クラスを表現する● 当然、privateやprotectedなメソッドは作成できない。すべてpublicとなる
よくある動物クラスの例typedef struct classAnimal{enumAnimalType type;funcSay say;} classAnimal;typedef struct classDog{classAnimal base;funcRun run;} classDog;typedef struct classBird{classAnimal base;funcFly fly;} classBird;
コンストラクタ・デストラクタ● コンストラクタ・デストラクタは、普通の関数として宣言する● 手動でコンストラクタ・デストラクタ関数を呼んで、メモリの確保・解放を行う○ コンストラクタ内で、オブジェクトにメソッドをセットする○ メンバ変数に別のオブジェクトを持つなら、さらにそのコンストラクタ役関数を呼び、メモリを確保、初期化する
コンストラクタ・デストラクタ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;}
コンストラクタ・デストラクタ#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);}
メソッド● メンバ関数は、予め関数ポインタ型をtypedefしておき、コンストラクタ内でセットする● メソッドは、関数ポインタをtypedefすることで表現する
● 当然、クラスの継承を行う文法も、無い● 親クラス構造体を、子クラスのメンバの一番目に宣言する○ 一番目であることが重要○ キャストしたときに、親オブジェクトと子オブジェクトが同じアドレスを指す● 親クラス構造体にキャストすることで、子クラス構造体のメンバは隠ぺいされる● 子クラス構造体メンバにアクセスしたい時は、子クラス構造体にキャストする継承とカプセル化
Child継承とカプセル化Parent Parentキャストして隠蔽キャストして子要素にアクセス
いかがでしたでしょうか?● C言語であってもオブジェクト指向に寄せた設計を行うことで、より体系だった開発を行うことができます
技術書典7、待ってろよ!!(震え声
We Are Hiring!大事なことなので2回弊社はC言語まったく使いません!!