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
860
C言語でオブジェクト指向プログラミング / object-oriented-in-c
2019/8/2 吉祥寺.pm にて、C言語でオブジェクト指向プログラミングできるんですよ、というご紹介をしました。
kazto
August 02, 2019
Tweet
Share
More Decks by kazto
See All by kazto
20250228-create-npm-package-with-wasm
kazto
1
71
Golangでwget劣化クローンをつくる / wget clone with golang
kazto
1
490
登壇を応援する会忘年LT_今からやぞ_.pdf
kazto
2
4.4k
Other Decks in Programming
See All in Programming
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
2
150
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
120
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
250
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
250
MDN Web Docs に日本語翻訳でコントリビュートしたくなる
ohmori_yusuke
1
120
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
800
Deep Dive into ~/.claude/projects
hiragram
14
2.5k
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
1
9.9k
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
320
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
470
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
170
Blazing Fast UI Development with Compose Hot Reload (droidcon New York 2025)
zsmb
1
290
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
524
40k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
How to Think Like a Performance Engineer
csswizardry
25
1.7k
Done Done
chrislema
184
16k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Balancing Empowerment & Direction
lara
1
430
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Making Projects Easy
brettharned
116
6.3k
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言語まったく使いません!!