C++ and C&GObject, not so much. They're very similar, only GObject is more advanced because it came later and learnt from the silly mistakes C++ made (no reflection, no properties (and by that, no automatic notification or monitor pattern), no reference counting, broken virtual methods, making copies all over the place, no Variant datatype, no signals, ...)
typedef struct _HDPluginLoader HDPluginLoader; typedef struct _HDPluginLoaderClass HDPluginLoaderClass; typedef struct _HDPluginLoaderPrivate HDPluginLoaderPrivate; #define HD_TYPE_PLUGIN_LOADER (hd_plugin_loader_get_type ()) #define HD_PLUGIN_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HD_TYPE_PLUGIN_LOADER, HDPluginLoader)) #define HD_PLUGIN_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), HD_TYPE_PLUGIN_LOADER, HDPluginLoaderClass)) #define HD_IS_PLUGIN_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HD_TYPE_PLUGIN_LOADER)) #define HD_IS_PLUGIN_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HD_TYPE_PLUGIN_LOADER)) #define HD_PLUGIN_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), HD_TYPE_PLUGIN_LOADER, HDPluginLoaderClass)) struct _HDPluginLoader { GObject gobject; HDPluginLoaderPrivate *priv; }; struct _HDPluginLoaderClass { GObjectClass parent_class; GObject *(* load) (HDPluginLoader *loader, const gchar *plugin_id, GKeyFile *keyfile, GError **error); }; ...
class HDPluginLoader { QObject* load(...) ... };