混合使用 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(),但是从未将其加入到父项中,也从未将其从父项中删除。
在所有其他情况下,当删除对C实例的最后一个引用时,C++实例将会自动被删除。这包括所有的Glib::wrap()所返回的Glib::RefPtr。