// so.c // gcc -Wall `pkg-config --libs --cflags glib-2.0 gobject-2.0` -o so so.c #include /* prototypes */ #define SIMPLE_OBJECT_TYPE (simple_object_get_type ()) #define SIMPLE_OBJECT (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ SIMPLE_OBJECT_TYPE, \ SimpleObject)) GType simple_object_get_type (); typedef struct _SimpleObject SimpleObject; typedef struct _SimpleObjectClass SimpleObjectClass; typedef struct _SimpleObjectPrivate SimpleObjectPrivate; struct _SimpleObject { GObject parent; SimpleObjectPrivate *priv; }; struct _SimpleObjectClass { GObjectClass parent_class; }; /* ************* normally in a c file ************************ **/ struct _SimpleObjectPrivate { int some_private_var; }; G_DEFINE_TYPE (SimpleObject, simple_object, G_TYPE_OBJECT); static void simple_object_class_init (SimpleObjectClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); SimpleObjectClass *so_class; g_type_class_add_private (klass, sizeof (SimpleObjectPrivate)); } static void simple_object_init (SimpleObject *so) { so->priv = G_TYPE_INSTANCE_GET_PRIVATE (so, SIMPLE_OBJECT_TYPE, SimpleObjectPrivate); } //NOTE: normally we would do properties for that void simple_object_set_foo (SimpleObject *so, int foo) { SimpleObjectPrivate *priv; priv = so->priv; priv->some_private_var = foo; } int simple_object_get_foo (SimpleObject *so) { SimpleObjectPrivate *priv; priv = so->priv; return priv->some_private_var; } int main (int argc, char **argv) { SimpleObject *obj; g_type_init (); obj = g_object_new (SIMPLE_OBJECT_TYPE, NULL); //do something with it simple_object_set_foo (obj, 42); g_print ("Foo: %d\n", simple_object_get_foo (obj)); g_object_unref (obj); return 0; }