C言語でオブジェクト指向プログラミングしようぜ!!

わたしは四つん這いで優雅に真昼のティータイムを過ごしていた。そんな時、ふとこう思った

 

C言語でもオブジェクト指向プログラミングしたい!!

 

 そんなわけで作成したものがこちら

cagayakemiracl/Miracle-C · GitHub

使い方はREADMEを参照してください。(適当 

 今のところ整数と文字列を扱うクラスのみ実装してます

メリット

  • 一般的なC言語のプログラミングですとint型の入力。char型の配列(文字列)の入力と全く別者として扱ってきましたがこのMiracle-C libraryを使えば何かを入力するという動作があってそれがIntクラスだとかStringクラスだとかになるのでごちゃごちゃせずにすむ。
  • 同じインスタンスの動作をメソッドチェーンで繋ぐ事が出来るので処理の流れを追いやすくなる。
  • ポインタをあまり意識せずにプログラムがかける。最初からポインタなので関数に渡すと値が変わる
  • 不要になったら削除できる

デメリット

  • 型とクラスが混在してキモいコードになる
  • deleteメソッドを呼び忘れるとメモリリークを起こす
  • getメソッドがうざい
  • C++とかObjective-Cでいいじゃん

このようにMiracle-C Libraryはメリットもデメリットもあります。

私個人が遊びで作ったものなのですが使ってくれる人がいたらうれしいなーー

これからも更新していくつもりです

 

このあとは動的配列を実装しようかなと思います

Rubyに似せたい願望があったので例えばInt(整数)クラスの配列を実現したいときArrayクラスのインスタンスの要素がIntクラスのインスタンスにしたかったのですが、Intクラスのインスタンス自身で線形リスト構造でとりあつかい動的配列を実現することにしました

理由はいくつか有ります

Arrayクラスをつくろうと思ったとき、まずインスタンス変数は線形リストのheadとtailを指すポインタ(void **)になります。なのでArrayクラスは先頭と最後の要素がなんのオブジェクトなのかわかりません。また各オブジェクトも前と後ろも同様です。こうなると各要素のインスタンスメソッドを呼びだそうとしたときそのクラスの型でキャストしなければなりません。この型はArrayクラスが知っておかなければならないのですが標準型だけならArrayクラスのインスタンス変数にクラスを識別する配列みたいなの作ればどうにかなるのですが自分で新しく定義したクラスのインスタンスを要素にすることが出来ないし、静的配列になってしまいます。

Arrayクラスを作って各要素が違うクラスのインスタンスにするということはとりあえずおいておきましょう

 

これでIntクラス自体で配列を実現するということになりましたIntクラス自身で動的配列を作ることは出来ます。prevポインタがNULLならhead。nextポインタがNULLならtailで判別可能なのです。その上Intクラスのインスタンスを生成したときそれをさす変数がheadになります

例えば要素が一つのIntクラスの値を初期化するにはfillメソッドを呼び出すかsetメソッドで1番めの要素である事を示す。要素が3つのIntクラスのインスタンスの2番目の要素を初期化したい時setメソッドを呼び出して2番めの要素であることを示す。全ての要素をある値にしたい時はfillメソッドを呼び出すというふうになります。(余談

しかしこれでは困ったことがあって今まではメモリリークを防ぐため各クラスのインスタンスのポインタを指す変数の型は読み取り専用にしていたのですが先頭の要素を取り出すshiftとかsortを実装すると考えたときそうではいけません。なのでユーザー側でキチンとメモリを開放したか管理しないといけません。まぁGCを実装すればいいんですね。わかります(白目

 

長ったらしく語りましたが相当適当なので間違ってたらごめんなさい。

またArrayクラスとGCを実装する方法がありましたら教えていただけたら嬉しいです

それではまた。