Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C言語でオブジェクト指向プログラミング / object-oriented-in-c
Search
kazto
August 02, 2019
Programming
1
920
C言語でオブジェクト指向プログラミング / object-oriented-in-c
2019/8/2 吉祥寺.pm にて、C言語でオブジェクト指向プログラミングできるんですよ、というご紹介をしました。
kazto
August 02, 2019
Tweet
Share
More Decks by kazto
See All by kazto
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
440
アイカツ!から学ぶビジネスパーソンとしての姿勢 / learn-the-attitude-of-businessperson-from-aikatsu
kazto
0
620
20250228-create-npm-package-with-wasm
kazto
1
120
Golangでwget劣化クローンをつくる / wget clone with golang
kazto
1
520
登壇を応援する会忘年LT_今からやぞ_.pdf
kazto
2
4.5k
Other Decks in Programming
See All in Programming
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
5.5k
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
940
AIエージェントの設計で注意するべきポイント6選
har1101
6
3.1k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
180
Grafana:建立系統全知視角的捷徑
blueswen
0
290
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
850
rack-attack gemによるリクエスト制限の失敗と学び
pndcat
0
180
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
250
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
190
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
450
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
450
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
360
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Documentation Writing (for coders)
carmenintech
77
5.2k
Fireside Chat
paigeccino
41
3.8k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
140
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
38
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The SEO Collaboration Effect
kristinabergwall1
0
330
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
42
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
1
360
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
130
Crafting Experiences
bethany
0
32
Transcript
C言語で オブジェクト指向 プログラミング 2019/8/2 吉祥寺.pm kazto
一句
PCの 電源切れて 冷や汗なう
技書博 お疲れ様 でした!
自己紹介 • なまえ ◦ kazto(かずと) • しょくれき ◦ 組み込み系SIerで16年半 ◦
社員数5人のWebベンチャーに半年 ◦ 2019年7月から、クーコム株式会社にJoin! ◦ 採用もやっていき! • しゅみ ◦ HR/HM鑑賞
We Are Hiring!
C言語で オブジェクト指向 プログラミング
Perlとオブジェクト指向 あとづけ→(昔は)無かった C言語→もともと無かった
PerlとC Perlは(ほぼ) 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言語まったく使いません!!