0

私は GObject を初めて使用します。あるクラスの親へのポインターを取得することについて混乱しました。たとえば、Gobject 仕様では、次のクラスがあります。

struct _MamanBarClass {
  GObjectClass parent;

  /* class members */
};

違いは何ですか :

MamanBarClass klass;
GObjectClass parent_class=G_OBJECT_CLASS(g_type_class_peek_parent (klass));

MamanBarClass klass;
GObjectClass g_object_class=G_OBJECT_CLASS(klass);

g_object_classparent_classの違いは何ですか

もう 1 つの質問: MamanBarClass(klass)MAMANBARCLASS(klass )のキャストの違い ありがとうございます。

4

1 に答える 1

2

GObject では、すべての新しい型がクラス構造体をレジスタに保持して、実行時情報、仮想メソッド、およびプライベート クラス データを保持します。

キャスト ( G_OBJECT_CLASS(klass)) は、klass の GObjectClass を取得するために使用され、klassの親G_OBJECT_CLASS(g_type_class_peek_parent(klass))のGObjectClass を返します。あなたの例では、前者は単純に MamanBarClass の GObjectClass 構造体を返し、後者はレジスタにある GObjectClass 構造体 (MamanBarClass の親) の GObjectClass 構造体を返します。実際には:

klass = G_OBJECT_CLASS(maman_bar_class);
/* This will override MamanBar::dispose */
klass->dispose = my_dispose;
/* Now my_dispose will be called by g_object_dispose(object) when object is a MamanBar object */

klass = G_OBJECT_CLASS(g_type_class_peek_parent(klass));
/* This will override GObject::dispose */
klass->dispose = my_dispose
/* Now my_dispose will be called by g_object_dispose(object) when object is a GObject (the parent class of MamanBar) object */

(MamanBarClass *) klassMAMAN_BAR_CLASS(klass)は同等ですが、後者は実行時の型チェックを実行します (klass が MamanBarClass * でない場合は g_critical を発行します)。

于 2012-12-07T16:26:42.050 に答える