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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kazto
August 02, 2019
Programming
1
930
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
480
アイカツ!から学ぶビジネスパーソンとしての姿勢 / learn-the-attitude-of-businessperson-from-aikatsu
kazto
0
690
20250228-create-npm-package-with-wasm
kazto
1
130
Golangでwget劣化クローンをつくる / wget clone with golang
kazto
1
530
登壇を応援する会忘年LT_今からやぞ_.pdf
kazto
2
4.6k
Other Decks in Programming
See All in Programming
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
8.2k
AHC061解説
shun_pi
0
400
SourceGeneratorのマーカー属性問題について
htkym
0
200
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
760
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
400
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
420
OTP を自動で入力する裏技
megabitsenmzq
0
120
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
750
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
250
モダンOBSプラグイン開発
umireon
0
160
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
440
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
1.1k
Featured
See All Featured
A better future with KSS
kneath
240
18k
Building an army of robots
kneath
306
46k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
A Tale of Four Properties
chriscoyier
163
24k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
480
GitHub's CSS Performance
jonrohan
1032
470k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
160
Building Flexible Design Systems
yeseniaperezcruz
330
40k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
990
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
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言語まったく使いません!!