$30 off During Our Annual Pro Sale. View Details »

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

kazto
August 02, 2019

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

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

kazto

August 02, 2019
Tweet

More Decks by kazto

Other Decks in Programming

Transcript

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

    View Slide

  2. 一句

    View Slide

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

    View Slide

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

    View Slide

  5. 自己紹介
    ● なまえ
    ○ kazto(かずと)
    ● しょくれき
    ○ 組み込み系SIerで16年半
    ○ 社員数5人のWebベンチャーに半年
    ○ 2019年7月から、クーコム株式会社にJoin!
    ○ 採用もやっていき!
    ● しゅみ
    ○ HR/HM鑑賞

    View Slide

  6. We Are Hiring!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. おしながき
    ● オブジェクト指向ってなんだったっけ?
    ● え?C言語?
    ● クラス
    ○ コンストラクタ・デストラクタ
    ● メソッド
    ● 継承とカプセル化

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. クラス=struct
    ● 当然、C言語にはクラスという文法は無い
    (二回目)
    ● 構造体を用いて、クラスを表現する
    ● 当然、privateやprotectedなメソッドは作成でき
    ない。すべてpublicとなる

    View Slide

  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;

    View Slide

  19. コンストラクタ・デストラクタ
    ● コンストラクタ・デストラクタは、普通の関数として
    宣言する
    ● 手動でコンストラクタ・デストラクタ関数を呼んで、
    メモリの確保・解放を行う
    ○ コンストラクタ内で、オブジェクトにメソッドをセットする
    ○ メンバ変数に別のオブジェクトを持つなら、さらにそのコンストラクタ役関数を呼
    び、メモリを確保、初期化する

    View Slide

  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;
    }

    View Slide

  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);
    }

    View Slide

  22. メソッド
    ● メンバ関数は、予め関数ポインタ型をtypedefして
    おき、コンストラクタ内でセットする
    ● メソッドは、関数ポインタをtypedefすることで表
    現する

    View Slide

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

    View Slide

  24. Child
    継承とカプセル化
    Parent Parent
    キャストして隠蔽
    キャストして
    子要素にアクセス

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide