その昔(といっても2ヶ月くらい前か?)途中で開発方針変えたため放棄したC++のソースをCに移植してる最中でぶつかった壁。
まだぶつかってるので躓いてる壁か?
単一クラス、振る舞いは変わるが継承、多態はないのなら、こんなのでいける。
typedef struct ObjectRec Object; struct ObjectRec { int x; int y; int (*squre)(Object*); };こんなことして、適当に関数ポインタに関数を突っ込んでやればいい。
たとえばこんなの。
static int realSqure(Object* o) { return o->x * o->y; } static int fakeSqure(Object* o) { return o->x * o->x * o->y * o->y; } Object* makeObject(int x, int y) { Object* o = (Object*)malloc(sizeof(Object)); o->squre = realSqure; o->x = x; o->y = y; return o; } Object* makeFakeObject(int x, int y) { Object* o = (Object*)malloc(sizeof(Object)); o->squre = fakeSqure; o->x = x; o->y = y; return o; }これで、同じo->squreなのに違う関数にアクセスできる。
この辺まではいいんだよ。昔から使ってたから。問題は継承が絡んでくると意味が分からん。
vtable使うか、メタクラスを別に作って気合でアクセスするか。
(多分、メタクラスを使った方が後々いい気がする。GObjectとかを参考にするか)
くそ、C++でかければこんなことで悩まないのに・・・
みんなDLLが悪いんだ!
No comments:
Post a Comment