Glib::RefPtr<>

因为最近要做C++的作业,所以看了看Gtkmm,我觉得这个库还是挺强大的。对于个人来说,从Java到C++不习惯的就是指针的问题了。Java的“指针”是引用的概念,JVM提供一个引用计数器来对资源进行管理,因此,新建对象后就不用对这个对象的内存管理了(引用计数为0时,清除对象)。而C++的指针却不同,我们用new分配内存后,还必须delete才算把这个对象删除。

而Glib::RefPtr就是在C++中实现JVM的引用计数功能(Reference Pointer)。利用Glib::RefPtr,可以简化对共享资源的管理。

不过对Glib::RefPtr<>的理解还在很初始的阶段。只是翻译一下官方文档……


基本使用

Glib::RefPtr<>的基本功能和普通指针差不多,意味着类似复制、调用方法、自动类型转换、空指针检查等和普通指针是没有差别的。因此

Glib::RefPtr<Gdk::Bitmap> refBitmap = Gdk::Bitmap::create(window,data, width, height);
Glib::RefPtr<Gdk::Bitmap> refBitmap2 = refBitmap;
Glib::RefPtr refBitmap = Gdk::Bitmap::create(window,data, width, height);
int depth = refBitmap->get_depth();
Glib::RefPtr<Gtk::TreeStore> refStore = Gtk::TreeStore::create(columns);
Glib::RefPtr<Gtk::TreeModel> refModel = refStore;
Glib::RefPtr<Gtk::TreeModel> refModel = m_TreeView.get_model();
if(refModel)
{
    int cols_count = refModel->get_n_columns();
    ...
}

但要注意的是,不能直接对Glib::RefPtr<>进行*操作访问内在实例。否则会造成编译错误。

另外,对Glib::RefPtr<>进行强制类型转换也是需要注意的。应该用

Glib::RefPtr<类型名>::cast_dynamic(待转换变量) // or Glib::RefPtr<...>::cast_static(...)

进行强制类型转换。


Constness 

关于Constness(我看到别人把它译为常量性),我看了译文以后也不是很明白,不过指向的译文中好像翻译有点问题……一开始没看懂。

You might not realise that const Something*declares a pointer to a const Something, The pointer can be changed, but not the Something that it points to.

这句话应该说的是“你可能注意到const Something*声明了一个指向const Something的指针,指针可以变,但所指向的内容不能变。”即内容是常量而不是指针是常量。

对于Glib::RefPtr<>来说也是那样,const Something*等价于const Glib::RefPtr<const Something>&,突出const Something应该当作一个整体类型。

不过我也还没怎么看懂官方文档关于常量性的描述的用处,大概在于描述怎样设计参数传递吧,也没怎么弄明白,或许我现在还在简单地进行开发阶段吧。

Glib::RefPtr<>的官方文档:http://developer.gnome.org.sixxs.org/gtkmm-tutorial/unstable/chapter-refptr.html.zh_CN