1

私は現在GObjectの使い方を学ぼうとしていますが、絶対に理解できない点があります。クラスとインスタンス構造("MamanBarClass""MamanBar"など)の違いは何ですか。どうやって使うの?
現時点では、すべてのオブジェクト属性をプライベート構造(「MamanBarPrivate」など)に配置し、「g_type_class_add_private」に登録して、それらにアクセスするためのプロパティ/ゲッター/セッターを定義します。しかし、クラス構造を空のままにすると、「g_type_register_static_simple」で次のエラーが発生します。

specified class size for type `MamanBar' is smaller than `GTypeClass' size

そして、なぜすべてのオブジェクトメソッドがクラス構造(「GtKWidgetClass」など)で定義されているのですか?おそらく私はすべてを台無しにしているだけですが、私はまだDelphi for OOPでしか作業していません(私は知っています、:Dについて誇りに思うことは何もありません)

よろしく

4

1 に答える 1

4

私は現在GObjectの使い方を学ぼうとしていますが、絶対に理解できない点があります。クラスとインスタンス構造("MamanBarClass"や"MamanBar"など)の違いは何ですか。どうやって使うの?

クラス構造は一度だけ作成され、インスタンス固有ではありません。これは、仮想メソッドのポインター(クラス構造体の最も一般的な使用法)など、インスタンス固有ではないものを配置する場所です。

現時点では、すべてのオブジェクト属性をプライベート構造( "MamanBarPrivate"など)に配置し、それを "g_type_class_add_private"に登録し、それらにアクセスするためのプロパティ/ゲッター/セッターを定義します。

良い。それは正しいことです。

しかし、クラス構造を空のままにすると、「g_type_register_static_simple」で次のエラーが発生します。

クラス構造を空のままにしないでください。継承元のタイプのクラス構造が常に含まれている必要があります。たとえば、GObjectを作成しようとしている場合、クラス構造は(少なくとも)次のようになります。

struct _MamanBarClass {
  GObjectClass parent_class;
};

GObjectから継承していない場合でも、GTypeの基本クラスが必要です。

struct _FooClass {
  GTypeClass parent_class;
};

これは、Cで単純な継承が行われる方法です。

そして、なぜすべてのオブジェクトメソッドがクラス構造(「GtKWidgetClass」など)で定義されているのですか?おそらく私はすべてを台無しにしているだけですが、私はまだDelphi for OOPでしか作業していません(私は知っています、:Dについて誇りに思うことは何もありません)

これらは仮想パブリックメソッドです。インスタンス構造ではなくクラス構造で定義されている理由は、すべてのインスタンスで実装が同じだからです。

于 2013-03-21T19:20:17.313 に答える