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

C++ gtkmm管理/添加vs智能指针:,c++,c++11,smart-pointers,lifecycle,gtkmm,C++,C++11,Smart Pointers,Lifecycle,Gtkmm,gtkmm使用这种构造提供小部件的生命周期管理: Gtk::Widget* aWidget = Gtk::manage(new Widget()); Gtk::Widget containerWidget; containerWidget.add(*aWidget); 这将aWidget的生命周期管理委托给containerWidget。当清理containerWidget时,它也会清理aWidget—类似于Delphi的“所有者”概念 我们还有几种类型的智能指针,特别是C++ 11智能

gtkmm使用这种构造提供小部件的生命周期管理:

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

Gtk::Widget containerWidget;

containerWidget.add(*aWidget);
这将aWidget的生命周期管理委托给containerWidget。当清理containerWidget时,它也会清理aWidget—类似于Delphi的“所有者”概念

我们还有几种类型的智能指针,特别是C++ 11智能指针模板,我到处使用。

我发现管理/Adple语法更容易使用,更干净,但它不是C++标准的一部分,它是GTKMM特有的特性,这使得我认为我应该坚持STD::SyrdY-PTR等。


因此,我想知道std智能指针与gtkmm管理/添加模型相比有哪些优点/缺点(除了删除所有者容器后需要引用的情况,或者当您有一个顶级小部件没有包含小部件时).

如果在添加小部件后不需要保留对该小部件的引用,我认为对小部件使用
shared\u ptr
是不切实际的。您最好使用托管小部件,而不是使用
shared\u ptr

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


一般来说,如果我在将小部件添加到容器后不需要引用它们,我会创建受管理的小部件。如果我确实需要引用它们,我会分配一个指针。

+1-“gtk::manage的优点…”是的。就像我的例子一样。但是“你最好把这个小部件放在堆栈上”——有时候效果不太好。但是我真的很喜欢manage/add-可能会在任何可能的时候都坚持使用它。我已经问了一个星期了,关于stackOverflow和程序员-你是第一个回答任何问题的人!我想也许人们对gtkmm不太了解——其实gtkmm很酷。关于WxWidgets、Qt、GTK+的讨论太多了,但是在GTK+之上的gtkmm在我看来,一旦你找到了自己的方法,它们就会被打败。一旦我在Glade中找到文档,我就被吸引住了。我非常喜欢Gtkmm,我一直在工作中使用它,关于堆栈上的小部件,如果你能创建一个共享,你可以将小部件放在堆栈xD上(因为你无论如何都需要将智能指针放在堆栈上),我想如果你想使用多态性,那么你需要堆上的对象和一个智能指针。如果您需要在几个类中使用这个小部件,那么共享ptr就很好了。但一般来说,如果我添加它们后不需要引用它们,我会管理我的小部件。如果我确实需要引用它们,我会将它们放在堆栈上。@Vector是的,GTKmm在我看来击败了它的竞争对手。GTK+的所有powr和支持/文档都没有C样板,也没有丑陋的Qt准C++,也不喜欢到处发垃圾邮件。我当前的项目没有堆分配的小部件,除了那些API仅通过
RefPtr
公开的小部件。FLTK在一段时间内看起来不错,直到我意识到它在两个(或者是1.5?)版本之间有多分裂。wxWidgets在Linux上使用GTK+,而且它充满了
宏(ugh)
,所以没有。GTKmm ftw!我很兴奋使用它,看到它的持续发展与语言。我的当前项目没有堆分配小部件,除了那些API只通过RefpTR我在家里构建的GUI应用程序来做,并做了一个转换:允许你在GUI C++中构建GUI应用程序,并在真实的RAIE精神中——这是一个很棒的东西。