hitode909の日記

趣味はマリンスポーツですの日記です

Cでクラスっぽいものを作ってみた

以前から、Cでクラスを作りたいと思っていたので、少し作ってみました。
前に作ろうとしたとき*1は、いろいろと考えた挙句何もしていなかったのですが、今回は、構造体を使ってクラスっぽいものを作ってみました。


ためしに、Humanクラスっぽいものを作ってみました。こんな風に使えます。

  human *taro;
  taro = newhuman("Taro", 18);
  taro->set_age(taro, 19);
  taro->greece(taro);
  taro = taro->delete(taro);

気に入らない点

呼び出す際に、対象のオブジェクトを2回呼ぶ必要がある

本当はtaro->set_age(19):と書きたいのですが、taro->set_age(taro,19);と書く必要があります。これは残念ですが、以前コメントで教えていただいた話によると、なかなか厳しいようです。
defineでできるということを教えていただいたのですが、それは試せていません。

deleteされたオブジェクトのメソッドを呼ぶとSegmentation Faultする

インスタンス変数も含めてよしなにfreeする、deleteが、NULLを返すようにしているのですが、その後に何らかのメソッドを呼ぼうとすると、関数へのポインタも消えてしまっているので、終了してしまいます。
呼び出し側でいちいちチェックするのはいやなので、悩みどころですね。

次の目標

今のところ、たいしたことはしていませんが、大きな問題もなく動いているように見えるので、暇なときに、これを使って実用的な何かを作ってみようと思います。
あと、1つのクラスっぽいものを1つのファイルにまとめてしまえば、内部の関数を隠蔽できるので、よりよいのではないかと思います。
また、一般的なCのまともなライブラリが内部的にどうなっているのかも興味があるので、調べてみたく思います。
それと、今のところ継承できていませんが、newhuman()の中でnewanimal()を呼べばオーバーライドしたり機能を拡張したりできそうな気がするものの、型をチェックされてしまうので、うまくいかないような気もします。さりげない形で関数呼び出しを実装すれば、うまくいくかもしれません。

*1:[http://d.hatena.ne.jp/hitode909/20080605/1212678851:title]