Re: help a newbie with GObject



Thank you, your translation really helped.

Sorry about some of my remarks ... I am not a C programmer (although I
do know C) and all this looks a little foreign to me.

I don't even know how to use GTK, but I want to learn how, and my way of
learning is bottom-up, that's why I started with GLib, although that's
not the recommended path of a newbie.

All things are clearer since yesterday, and I'm slowly getting used to
the syntax. I'm not scared because it is baroque, I'm scared because
there are things that I do not understand how they work ... but I'll
figure it out.


Thanks again,




On Sun, 2006-08-06 at 02:51 +0200, David Nečas (Yeti) wrote:
> On Sun, Aug 06, 2006 at 02:11:51AM +0300, Alex Nedelcu wrote:
> > I am trying to wrap my head around the GObject/GType system, but because
> > of the lack of good documentation I am having trouble understanding it.
> > 
> > Do you know any good tutorial on GObject ?
> > I found the tutorial available on developer.gnome.org
> > (http://www.le-hacker.org/papers/gobject/) not for newbies.
> 
> The tutorial is now a part of GObject API documentation --
> and it is good if you ask.  In fact I cannot imagine what do
> you mean by the `lack of good documentation'.
> 
> > So I figured that the best way to understand anything is too have a
> > working equivalent of something I can understand.
> 
> In my opinion to understand GObject one should forget the
> object oriented mumbo jumbo for a while and view both
> classes and instances and the plain C structs they
> physically are and how they contain their parents like
> a matryoshka.  That is to imagine what
> 
>   struct _Child {
>       Parent parent_instance;
> 
>       gint data_member;
>   };
> 
> and
> 
>   struct _ChildClass {
>       ParentClass parent_class;
> 
>       void (*method)(Child *child);
>   };
> 
> actually means.  How [almost] everything else works clearly
> follows from that.  The syntax is kind of baroque but a user
> of Gtk+ should be already trained to it.
> 
> > Can someone be kind and translate the following Java classes in C using
> > GObject ?
> > 
> > (I am guessing that it should be a trivial task for someone experienced
> > with the GObject system)
> > 
> > Thanks in advance ...
> 
> I'm leaving out the boilerplate, it is well described in the
> tutorial and it adds lots of code to read without any value
> (I doubt I have ever written it manually, I just take it
> from anotehr file and use s/// to change names).  I'm also
> prefixing everything with my- (which is how namespaces are
> made in C).
> 
> Also see Gtk+ source code -- Gtk+ is nothing more than
> a large collection of GObject examples...
> 
> > 
> > abstract class Animal
> > {
> > 	void feed()
> > 	{
> > 		print("Feeding some animal");
> > 	}
> > }
> 
> myanimal.h ================================================
> 
> struct _MyAnimalClass {
>     GObjectClass parent_class;
> 
>     void (*feed)(MyAnimal *animal);
> };
> 
> struct _MyAnimal {
>     GObject parent_instance;
> 
>     /* empty */
> };
> 
> 
> void my_animal_feed(MyAnimal *animal);
> 
> 
> myanimal.c ================================================
> 
> static void my_animal_feed_real(MyAnimal *animal);
> 
> G_DEFINE_ABSTRACT_TYPE(MyAnimal, my_animal, G_TYPE_OBJECT)
> 
> static void
> my_animal_class_init(MyAnimalClass *klass)
> {
>     klass->feed = &my_animal_feed_real;
> }
> 
> static void
> my_animal_init(MyAnimal *animal)
> {
>     /* empty */
> }
> 
> void
> my_animal_feed(MyAnimal *animal)
> {
>     /* Generally the method must be tested for NULL, but
>      * here we know it always exists */
>     MY_ANIMAL_GET_CLASS(animal)->feed(animal);
> }
> 
> static void
> my_animal_feed_real(MyAnimal *animal)
> {
>     printf("Feeding some animal\n");
> }
> 
> > class Dog extends Animal
> > {
> > 	static int legs = 4;
> > 
> > 	String name;
> > 	int age;
> > 
> > 	public Dog(String name, int age)
> > 	{
> > 		this.name = name;
> > 		this.age = age;
> > 	}
> > 	
> > 	void feed()
> > 	{
> > 		print("Feeding a canine named " + this.name);
> > 	}
> > }
> 
> mydog.h ================================================
> 
> struct _MyDogClass {
>     MyAnimalClass parent_class;
> 
>     gint legs;
> };
> 
> struct _MyDog {
>     MyAnimal parent_instance;
> 
>     GString *name;
>     gint age;
> }
> 
> MyDog* my_dog_new(const gchar *name, gint age);
> 
> 
> mydog.c ================================================
> 
> static void my_dog_finalize(GObject *object);
> static void my_dog_feed(MyAnimal *animal);
> 
> G_DEFINE_TYPE(MyDog, my_dog, MY_TYPE_DOG)
> 
> static void
> my_dog_class_init(MyDogClass *klass)
> {
>     GObjectClass gobject_class = G_OBJECT_CLASS(klass);
>     MyAnimalClass animal_class = MY_ANIMAL_CLASS(klass);
> 
>     gobject_class->finalize = &my_dog_finalize;
>     animal_class->feed = &my_dog_feed;
>     /* The semantics is not exactly the same */
>     klass->legs = 4;
> }
> 
> static void
> my_dog_init(MyDog *dog)
> {
>     dog->name = g_string_new("");
> }
> 
> static void
> my_dog_finalize(GObject *object)
> {
>     MyDog *dog;
> 
>     dog = MY_DOG(object);
>     g_string_free(dog->name, TRUE);
> 
>     /* Generally the method must be tested for NULL, but
>      * here we know it always exists */
>     G_OBJECT_CLASS(my_dog_parent_class)->finalize(object);
> }
> 
> MyDog*
> my_dog_new(const gchar *name,
>            gint age)
> {
>     MyDog *dog;
> 
>     dog = g_object_new(MY_TYPE_DOG, NULL);
>     g_string_assign(dog->name, name);
>     dog->age = age;
>     /* If MyDog registered name and age as properties we
>      * could also do
>      * dog = g_object_new(MY_TYPE_DOG, "name", name, "age", age, NULL);
>      */
> 
>     return dog;
> }
> 
> static void
> my_dog_feed(MyAnimal *animal)
> {
>     MyDog *dog;
> 
>     dog = MY_DOG(animal);
>     printf("Feeding a canine named %s\n", dog->name->str);
> }
> 
> > // .......
> > 
> > Animal animals[] = {
> > 	new Dog("Bella", 2),
> > 	new Dog("Toto", 3)
> > };
> > 
> > for (int i=0; i<animals.length; i++)
> > 	animals[i].feed();
> 
> /* The array initialization above is too dynamic plain
>  * old C, so just make two animals to demonstrate feed().
>  *
>  * Also, it is impossible to work with GObjects by _value_,
>  * use pointers. */
> 
> static MyAnimal *animals[2];
> 
> animals[0] = MY_ANIMAL(my_dog_new("Bella", 2));
> animals[1] = MY_ANIMAL(my_dog_new("Toto", 3));
> 
> for (i = 0; i < G_N_ELEMENTS(animals); i++)
>     my_animal_feed(animals[i]);
> 
> 
> Yeti
> 
> 
> --
> Anonyms eat their boogers.
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]