- から
A継承しBます。次に、のAすべてBのプロパティが自動的に設定されます。
- でプロパティを使用しないでください
A。代わりに、Bのプロパティ(またはさらに良いのはすでに構築されたBオブジェクト)をパラメータとしてA'コンストラクタに渡します。
Bまでの構築を遅らせるAことで、構成がどのように必要かを理解できますB。の内部ポインタが有効かどうかAを示すプライベートフラグなどを追加します。b_initializedAB
2番目の提案に関するもう少し説明:
Aのものは、マクロa_init()によって提供される関数で構築されます。G_DEFINE_TYPE()しかし、それはあなたがのインスタンスを取得する方法ではありませんA。通常、のパブリックインターフェイスの一部である関数を次のように記述しますA。
A *a_new()
{
return (A *)g_object_new(TYPE_A, NULL);
}
これを簡単に拡張して、他のパラメーターを含めることができます。
A *a_new(int b_param_1, int b_param_2)
{
A *a = (A *)g_object_new(TYPE_A, NULL);
a->priv->b = b_new(b_param_1, b_param_2);
return a;
}
これには、たとえばGtkBuilderファイルからオブジェクトを構築しようとしている場合など、オブジェクトを使用して構築した場合Aに、オブジェクトが無効な状態(つまり、なし)のままになるという欠点があります。それが問題である場合でも、リファクタリングを強くお勧めします。Bg_object_new