gobject instantiation

MamanBar *bar = g_object_new (MAMAN_TYPE_BAR, NULL);


first instantiation of an object,

        (1) maman_b_class_init is invoked after any mam_b_base_class_init

          --->make sure the class structure of this new object is correctly initialized

-->setup the class' own methods. (e.g. the constructor method is the overridden method,i.e. Set to mam_bar_constructor).


After g_object_new has obtained a reference to an initialized class structure

       (2)invokes its constructor method(maman_bar_constructor) to create an instance of the new object.

       (3)mam_bar_consturctor chains up parent's constructor

       (4)g_object_constructor is invoked :

            a. allocates the object's instance's buffer through g_type_create_instance

                                                                                    ==>where instance_init is invoked

            b.set the construction properties(i.e. The properties given to g_object_new)


  1. #define MAMAN_TYPE_BAR                  (maman_bar_get_type ())
  2. #define MAMAN_BAR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
  3. #define MAMAN_BAR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
  4. #define MAMAN_IS_BAR(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
  5. #define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
  6. #define MAMAN_BAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))
  7. typedef struct _MamanBar MamanBar;
  8. typedef struct _MamanBarClass MamanBarClass;
  9. struct _MamanBar {
  10.   GObject parent;
  11.   /* instance members */
  12. };
  13. struct _MamanBarClass {
  14.   GObjectClass parent;
  15.   /* class members */
  16. };
  17. /* used by MAMAN_TYPE_BAR */
  18. GType maman_bar_get_type (void);
  19. static GObject *
  20. maman_bar_constructor (GType                  type,
  21.                        guint                  n_construct_properties,
  22.                        GObjectConstructParam *construct_properties)
  23. {
  24.   GObject *obj;
  25.   {
  26.     /* Invoke parent constructor. */
  27.     MamanBarClass *klass;
  28.     GObjectClass *parent_class;  
  29.     klass = MAMAN_BAR_CLASS (g_type_class_peek (MAMAN_TYPE_BAR));
  30.     parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
  31.     obj = parent_class->constructor (type,
  32.                                      n_construct_properties,
  33.                                      construct_properties);
  34.   }
  35.   
  36.   /* do stuff. */
  37.   return obj;
  38. }
  39. static void
  40. maman_bar_instance_init (GTypeInstance   *instance,
  41.                          gpointer         g_class)
  42. {
  43.   MamanBar *self = (MamanBar *)instance;
  44.   /* do stuff */
  45. }
  46. static void
  47. maman_bar_class_init (gpointer g_class,
  48.                       gpointer g_class_data)
  49. {
  50.   GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
  51.   MamanBarClass *klass = MAMAN_BAR_CLASS (g_class);
  52.   gobject_class->constructor = maman_bar_constructor;
  53. }
  54. GType maman_bar_get_type (void)
  55. {
  56.   static GType type = 0;
  57.   if (type == 0) {
  58.     static const GTypeInfo info = {
  59.       sizeof (MamanBarClass),
  60.       NULL,   /* base_init */
  61.       NULL,   /* base_finalize */
  62.       maman_bar_class_init,   /* class_init */
  63.       NULL,   /* class_finalize */
  64.       NULL,   /* class_data */
  65.       sizeof (MamanBar),
  66.       0,      /* n_preallocs */
  67.       maman_bar_instance_init    /* instance_init */
  68.     };
  69.     type = g_type_register_static (G_TYPE_OBJECT,
  70.                                    "MamanBarType",
  71.                                    &info, 0);
  72.   }
  73.   return type;
  74. }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章