C++ Gtkmm:将RefPtr与保存在std::vector中的小部件一起使用
我试图保持一个C++ Gtkmm:将RefPtr与保存在std::vector中的小部件一起使用,c++,c++11,vector,gtk,gtkmm,C++,C++11,Vector,Gtk,Gtkmm,我试图保持一个Gtk::Widgets的std::vector,我正在显示(并且可能会显示)它在Gtk::Containers之间移动 目前,我保留了一个Gtk::Notebook,它基本上是到std::vector的一对一映射,但是如果我在小部件周围使用Glib::RefPtr,我在从笔记本中删除小部件时会遇到问题。我已经必须使用“hack”在将底层Gtk对象添加到笔记本时获取指向该对象的指针,我怀疑笔记本容器在我将其从容器中移除时释放/删除了该对象 我已经定义了我的小部件向量,如下所示: s
Gtk::Widget
s的std::vector
,我正在显示(并且可能会显示)它在Gtk::Container
s之间移动
目前,我保留了一个Gtk::Notebook
,它基本上是到std::vector
的一对一映射,但是如果我在小部件周围使用Glib::RefPtr
,我在从笔记本中删除小部件时会遇到问题。我已经必须使用“hack”在将底层Gtk对象添加到笔记本时获取指向该对象的指针,我怀疑笔记本容器在我将其从容器中移除时释放/删除了该对象
我已经定义了我的小部件向量,如下所示:
std::向量小部件代码>
当我向向量和笔记本添加小部件时,我会:
Glib::RefPtr<Gtk::Widget> w (new Gtk::Widget());
widgets.push_back (w);
Gtk::Widget *wptr = w.operator->(); // hack
notebook.append_page (*wptr);
但这会导致G_IS_OBJECT
断言失败,因为可能notebook.remove_page()
已经释放了对象,所以(我认为)在iterator
的末尾清除std::vector
中的元素。我该怎么做?是否可以使用RefPtr
相关(相同的断言失败):很遗憾,您不能这样做,因为Gtk::Notebook
拥有子对象的所有权。您必须重构代码,以使用Gtk::Notebook
本身来访问小部件,而不是向量
,例如,不幸的是,您不能这样做,因为Gtk::Notebook
拥有子对象的所有权。您必须重构代码,以使用Gtk::Notebook
本身来访问小部件,而不是vector
,例如,Glib::RefPtr不应与小部件一起使用。它不是通用智能指针。它只应与强制使用它的类一起使用-没有公共构造函数,但有公共create*()方法。Glib::RefPtr不应与小部件一起使用。它不是通用智能指针。它应该只与强制您使用它的类一起使用-没有公共构造函数,但有公共create*()方法。在删除小部件的情况下,所示示例中的向量至少有两个小部件?(记住向量中的索引是以零为基的。)是的。在本例中,我假设我已经向笔记本和向量添加了几个小部件。在移除小部件的情况下,所示示例中的向量至少有两个小部件?(记住向量中的索引是以零为基的。)是的。在这个例子中,我假设我已经向笔记本和向量添加了几个小部件。
int c = 1; // widget no. to remove
notebook.remove_page (c);
auto it = widgets.begin() + c;
widgets.erase (it);