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);