## Boilerplate code

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.