GLib/GObject+C as the lingua franca?

nf2 nf2 at scheinwelt.at
Sun Jul 27 19:26:36 BST 2008


koos vriezen wrote:
> 2008/7/27 nf2 <nf2 at scheinwelt.at>:
>
>   
>> Why? I think a lot of things that are tiring with plain C - like strings,
>> containers and garbage collection might be a bit easier with a bit of C++.
>> For instance a simple GObjectWrapper<T> which automatically
>> g_object_un_ref's in the destructor - and g_object_refs on copy might help.
>> Or a C++ wrapper for GError (that you don't need g_error_free()s all over
>> the place)... If someone wants to write a GObject based library in C++,
>> perhaps it's worth looking for an appropriate (but still simplistic) style.
>>     
>
> I don't think there is that much to gain, whether you do
> glib_type_new/g_object_unref vs. new GFoo/delete gfoo. Only you can
> create the object on the stack, which saves you the delete call (not
> for QObject's though)
>
> Of course this very much depends on the use case. Eg. I maintain a
> program both for KDE as for Maemo, and being able to apply patches
> easy, I did do some C++ wrapping on simple types as QString and KUrl
> (the GUI is completely different anyhow).
> A common code pattern might be a class candidate, often a function
> will do as well. But doing heavy wrapping in the beginning of the
> coding often shows unwanted frictions later, turning to hacks and the
> code gets uglier and uglier.
> Wrapping toolkits to others is just a pain, Luckily we can use C
> directly like glib, expat, libjpeg you-name-it.
>
> Stick with the toolkit API.
>
>
>   

I thought of really lightweight wrapping. Very minimalistic. See the 
example below. Mainly that you can put GObjects into C++ containers and 
for garbage collection...

I believe heavy wrapping - like gtkmm is more interesting for library 
"end-users" like application developers, but not here.

Norbert

-------------------- C Code ------------------------

GError * err = NULL;
GFile * gFile = g_file_new_for_uri("ftp://user@server/file");
       
GFileInfo* gFileInfo = g_file_query_info( gFile,
                "*",
                G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
                NULL,
                &err);

if (err)
{
      printf("error %s\n", err->message);
      g_error_free(err);

      g_object_unref (gFile);
      return;
}   


----------------- C++ Code -------------------

GOError err;
GO<GFile> gFile = g_file_new_for_uri("ftp://user@server/file");
       
GO<GFileInfo> gFileInfo = g_file_query_info( gFile.p,
                "*",
                G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
                NULL,
                err.pp());

if (err.hasError())
{
      cout << "error " << err.message();
      return;
}   









More information about the kde-core-devel mailing list