From: Masaki Fukushima Date: 2000-02-05T23:16:57+09:00 Subject: [ruby-list:20513] Re: swigruby example(Qt) 福嶋です。 matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > |ところが、qtモジュールでとりこまれた、QWidgetなどを継承した > |クラスを作ることができないようです。 > > swigrubyの生成したコードを見る限りRubyレベルでサブクラスは作 > れない作りになってますね。これは福嶋さんに改善のお願いを出し > ても良いんじゃないでしょうか。 その通りです。Rubyレベルで継承することは、あまり考慮していません でした。とりあえず、以下のパッチが有効なはずです。 > Wrap_QObject()に引数を追加するか、selfを参照するようにするか。 Wrap_xxx()はnew以外でも使われる可能性があるので、引数を追加する方 法でやってみました。 ただ、Rubyレベルでメソッドを定義しても、C++レベルで定義されている メッソドはオーバーライドできない点には注意して下さい。template methodパターンが使われている場合はこれが問題になるかも知れません。 > 私はポインタでないユーザ定義型で SWIG_MakePtr を使わないで > Wrap_xxx() を使って欲しいという要望があります。そうすると > SWIG_MakePtrに関連する大量のコードが削除できそうな気がします。 > # SWIGの作りから言ってそれは無理か。 どうでしょう。ちょっと考えてみます。 9日が修論発表なので、それが終わったら時間が取れると思うので。 swigrubyに関しては、まだいろいろ改善できる点があると思います。 ただ、SWIG自体が現在大幅な改良の最中で、その新しいバージョンに対 応させる時には、ほとんど書き直さなきゃならない気がしてます。 --- ruby.cxx 1999/11/26 07:34:00 1.4 +++ ruby.cxx 2000/02/05 13:04:50 @@ -823,7 +823,8 @@ s << "$target = $source;"; } else if (strcmp("out", op) == 0 && type->type == T_USER && type->is_pointer == 1 && cls) { - s << "$target = Wrap_" << cls->cname << "($source);"; + char *vname = (current == CONSTRUCTOR ? "self" : (char *)cls->vname); + s << "$target = Wrap_" << cls->cname << "(" << vname << ", $source);"; } else if (strcmp("in", op)==0 && type->type == T_USER && type->is_pointer == 1 && cls) { s << "Get_" << cls->cname << "($source, $target);"; @@ -1011,8 +1012,8 @@ klass->header << "$markproto" << "$freeproto" - << "#define Wrap_" << klass->cname << "(ptr) (\\\n" - << tab4 << "(ptr) ? Data_Wrap_Struct(" << klass->vname + << "#define Wrap_" << klass->cname << "(klass, ptr) (\\\n" + << tab4 << "(ptr) ? Data_Wrap_Struct(klass" << ", $markfunc, $freefunc, ptr) : Qnil )\n" << "#define Get_" << klass->cname << "(val, ptr) {\\\n" << tab4 << "if (NIL_P(val)) ptr = NULL;\\\n" --- 福嶋正機