In your code, the first step is to #include
the
needed headers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* * Copyright information */ #include "viewer-file.h" /* Private structure definition. */ typedef struct { gchar *filename; /* stuff */ } ViewerFilePrivate; /* * forward definitions */ |
If the class is being declared as final using
G_DECLARE_FINAL_TYPE
, its instance structure should
be defined in the C file:
1 2 3 4 5 6 |
struct _ViewerFile { GObject parent_instance; /* Other members, including private data. */ } |
Call the G_DEFINE_TYPE
macro (or
G_DEFINE_TYPE_WITH_PRIVATE
if your class needs
private data — final types do not need private data)
using the name
of the type, the prefix of the functions and the parent GType to
reduce the amount of boilerplate needed. This macro will:
- implement the
viewer_file_get_type
function - define a parent class pointer accessible from the whole .c file
- add private instance data to the type (if using
G_DEFINE_TYPE_WITH_PRIVATE
)
If the class has been declared as final using
G_DECLARE_FINAL_TYPE
(see
the section called “Boilerplate header code”), private data should be placed in
the instance structure, ViewerFile, and
G_DEFINE_TYPE
should be used instead of
G_DEFINE_TYPE_WITH_PRIVATE
. The instance structure
for a final class is not exposed publicly, and is not embedded in the
instance structures of any derived classes (because the class is final);
so its size can vary without causing incompatibilities for code which uses
the class. Conversely, private data for derivable classes
must be included in a private structure, and
G_DEFINE_TYPE_WITH_PRIVATE
must be used.
1 |
G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) |
or
1 |
G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) |
It is also possible to use the
G_DEFINE_TYPE_WITH_CODE
macro to control the
get_type
function implementation — for instance, to
add a call to the G_IMPLEMENT_INTERFACE
macro to
implement an interface.