トリッキーなコード

このエントリーをはてなブックマークに追加
416>414
俺もCで>>414みたいな多態まがいまでやったけど、手間掛かるね。
継承、多態を実装する場合スタックに作れないのはいいんだけど。
Cでやる場合、
・自前でコンストラクタデストラクタ起動する手間。
・インスタンス毎にメソッド関数のポインタの領域が取られる。
(C++のvirtualの様にはいかない)
まあ関数テーブルをstaticな所に置いておけばいいんだけどね・・。
・自分しかメンテする人がいない。
言い換えれば、教える手間が掛かる(苦笑
C++嫌いでここまでやるなら、
Objective-Cのトランスレータ使った方がいいかも。
(スクリプト〜のスレにリンクあります)
417416:2001/05/03(木) 02:23
ヒープベースでいいなら、インスタンスのチェインを作ったり、
マクロで変換したり色々楽する方法はあるけど、
純粋なCの使い方じゃないんだろうなあ・・
↑に追加するなら、あと、
・コンパイラが型保障してくれない。
これが痛い。どうしても(void*)使いまくる事になるからね。
418416:2001/05/03(木) 02:30
よって完全を喫したい場合、デバッグ時などで
メソッド関数の入り口で
if (self->classid == 〜)
とかする必要がある。
利点は
・OO(風)実装の質加減を自分で決定できる。
・Cは言語仕様が小さいので環境を選ばない。
・どうせ(void*)主体なのでC++の様な大掛かりなtemplateは必要ない。
ぐらいかな。
419416:2001/05/03(木) 02:45
欠点追加
・インライン展開してくれない。(inlineキーワードが使えない)
アクセサとか、なにも考えずに定義できない。
gccやVisualC++ならCでも__inline__使えるので、
使えない処理系毎にマクロで切り分けるはめに・・
・本質と関係無いコードの量が多くなる。
モチベーションが低下する。しょうがないんだけど。
思考するための言語の使い方としては最悪。
だから純粋にOO可能な言語でプロトタイプ作って
C移行やるのがベストかも。(どうしてもやるなら)
420416:2001/05/03(木) 03:01
純粋OO言語→Cのトランスレーターがあればそれ使うのが一番良い。
(ありがちな問題として「純粋OO言語」のライブラリ群をどうやって
Cへ変換するるかだけど、それぐらい無かったら自分で作る。)
やっぱりCで自分で書くのは疲れるよ。無茶するのは健康に悪い。
421416:2001/05/03(木) 03:27
楽する方法
typedef enum {method1, method2, method3 ...} method_t;
static struct {
methodid_t id;
methodproc_t
} method_tbl {
method1, method1_proc
method2, method2_proc
:
};
dispatch(obj, method1, param...);
こんな風にメッセージの受け口は全部dispatchにするとか。
method探索の効率はhashとか使えばそれほど悪くならない。
必要ならマクロかなにかでdispatch->直呼びに変換する。
422416:2001/05/03(木) 03:39
楽する方法その2
ブロックの間だけ使用するインスタンス群の自動デストラクト
ヒープベースでのみ使用できる。
インスタンスのチェインを作る必要がある。
{
 handle_t h = enter_scope(chain);
 obj_t obj1 = newobj(chain, classid1);
 obj_t obj2 = newobj(chain, classid2);
 obj_t obj3 = newobj(chain, classid3);
 ;
 leave_scope(chain, h); obj1/2/3の自動デストラクト
}
もちろんハンドルを保持すればデストラクトを持ち越す事ができる。
この辺は実際に使って有効だった手法。