gtkmm的管理/添加 vs 智能指针:

4

gtkmm使用这种结构来管理小部件的生命周期:

Gtk::Widget* aWidget = Gtk::manage(new Widget()); 

Gtk::Widget containerWidget;

containerWidget.add(*aWidget);

这将aWidget的生命周期管理委托给containerWidget。当containerWidget被清理时,它也会清理aWidget-类似于Delphi的“所有者”概念。

我们还有几种智能指针类型,特别是C++11智能指针模板,我在任何地方都使用它们。

我发现manage/add语法更易于使用和清洁,但它不是C++标准的一部分,而是一个gtkmm特定的功能,这让我想要坚持使用std::shared_ptr等。

所以我想知道std智能指针与gtkmm manage/add模型的优缺点是什么(除了需要在拥有者容器被删除后仍需引用或当您有一个没有包含小部件的顶层小部件的情况)。

1个回答

3

如果您添加了小部件后不需要保留对该小部件的引用,那么使用shared_ptr来处理小部件可能并不实际。相反,最好使用受管理的小部件。

gtk::manage的好处在于,您可以在堆上创建对象并将其添加到容器中,然后忘记它。当销毁该容器时,它也会销毁小部件。

通常情况下,如果我在将小部件添加到容器后不需要引用它们,我会将它们设置为受管理状态;如果需要引用它们,则会分配一个指针。


+1 - "关于gtk::manage的好处是..." 是的,就像我的例子一样。但是"最好将小部件放在堆栈上" - 有时候这并不总是那么顺利。但我真的很喜欢manage/add - 可能会尽量使用它。 - Vector
1
我已经在StackOverflow和程序员社区上问了一个星期这个问题,来回查找答案 - 你是第一个回答的人!我认为可能人们对gtkmm并不了解 - 实际上它非常强大。有关WxWidgets、Qt、GTK+的讨论很多,但是在我看来,一旦你找到方法,使用gtkmm可以击败它们所有。一旦我在Glade中找到了文档,我就被迷住了。 - Vector
1
我非常喜欢使用Gtkmm,在工作中经常使用。关于堆栈上的Widget,如果您可以创建一个share_ptr,那么您可以将Widget放在堆栈上(因为您无论如何都需要将智能指针放在堆栈上)。但是,如果您想使用多态性,则需要将对象放在堆上,并且智能指针会很有用。如果您需要在几个类中使用该小部件,则share_ptr将很好。但是,通常规则是,如果我添加后不需要引用它们,则自己管理小部件;如果需要引用它们,则将它们放在堆栈上。 - AngelCastillo
但作为一般规则,似乎就是这样的。请将这些内容放入您的答案中 - 我会接受它。 - Vector
1
@Vector 是的,依我之见,GTKmm在竞争对手中遥遥领先。它拥有GTK+的所有功能和支持/文档,但没有C样板代码,也没有Qt那种丑陋的准C++,也没有到处滥用指针的倾向。我的当前项目除了API只通过RefPtr公开的小部分堆分配窗口小部件外,没有其他堆分配的窗口小部件。FLTK看起来很不错,直到我意识到它在两个(或者说1.5个?)版本之间分裂了。wxWidgets在Linux上也使用GTK+,而且充斥着MACROS(ugh),所以算了吧。GTKmm赢了!我很兴奋能够使用它,并看到它与语言一起不断发展。 - underscore_d
1
我的当前项目除了API只通过RefPtr公开的控件外,没有堆分配的控件。在家中构建GUI应用程序时,我也完全遵循这一原则,并成为了它的忠实拥护者:允许您在纯C++中构建GUI应用程序,并真正地体现了RAII的精神——简直是太棒了。 - Vector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接