Mixing C and C++ APIs
| Chapter 3. Basics |

## Mixing C and C++ APIs

You can use C APIs which do not yet have convenient C++ interfaces. It is generally not a problem to use C APIs from C++, and gtkmm helps by providing access to the underlying C object, and providing an easy way to create a C++ wrapper object from a C object, provided that the C API is also based on the `GObject` system.

To use a gtkmm instance with a C function that requires a C `GObject` instance, use the C++ instance’s `gobj()` function to obtain a pointer to the underlying C instance. For example:

    Gtk::Button* button = new Gtk::Button("example");
    gtk_button_do_something_that_gtkmm_cannot(button->gobj());

To obtain a gtkmm instance from a C `GObject` instance, use one of the many overloaded `Glib::wrap()` functions. The C instance’s reference count is not incremented, unless you set the optional `take_copy` argument to `true`. For example:

    GtkButton* cbutton = get_a_button();
    Gtk::Button* button = Glib::wrap(cbutton);
    button->set_label("Now I speak C++ too!");

The C++ wrapper shall be explicitly deleted if

- it's a widget or other class that inherits from `Gtk::Object`, and

- the C instance has a floating reference when the wrapper is created, and

- `Gtk::manage()` has not been called on it (which includes if it was created with `Gtk::make_managed()`), or

- `Gtk::manage()` was called on it, but it was never added to, or was later removed from, its parent.

`Glib::wrap()` binds the C and C++ instances to each other. Don't delete the C++ instance before you want the C instance to die.

In all other cases the C++ instance is automatically deleted when the last reference to the C instance is dropped. This includes all `Glib::wrap()` overloads that return a `Glib::RefPtr`.

Intermediate types |  | Hello World in gtkmm