混合使用 C 和 C++ API

你可以使用那些尚未提供 C++ 接口的 C API。对于 C++ 而言这一般不是什么问题,gtkmm 可以提供帮助访问底层的 C 对象,并且也提供了一个简单的方式来从一个 C 对象创建一个 C++ 封装的对象,当然,这个 C API 是需要基于 GObject 系统的。

要用 C 函数使用一个 gtkmm 实例需要一个 C GObject 实例,使用C++的gobj()接口函数可以得到一个底层 GObject 实例的指针。例如:

Gtk::Button button("example");
gtk_button_do_something_that_gtkmm_cannot(button.gobj());

要从C的GObject实例获得一个gtkmm,请使用许多个Glib::wrap()函数的其中一个重载。除非你将可选的take_copy参数设置为true,否则C实例的引用计数将不会增加。例如:

GtkButton* cbutton = get_a_button();
Gtk::Button* button = Glib::wrap(cbutton);
button->set_label("Now I speak C++ too!");
如果
  • 它是一个部件或者是继承自Gtk::Object的其他类,并且
  • 当封装被创建的时候C示例拥有一个浮动引用,并且
  • 并未在其上调用Gtk::manage()(包括使用Gtk::make_managed()创建的) ,或者
  • 在其上调用了Gtk::manage(),但是从未将其加入到父项中,也从未将其从父项中删除。
Glib::wrap()将C和C++示例相互绑定,则应明确删除C++包装器。请不要在C示例死亡前删除C++实例。

在所有其他情况下,当删除对C实例的最后一个引用时,C++实例将会自动被删除。这包括所有的Glib::wrap()所返回的Glib::RefPtr