我在 C++ 中使用基类来模仿 Java 中的接口,这样我就不必为我创建的每个不同的类重复一些代码或创建对象。
基本上它包含一个 GtkBuilder 的 RefPtr,我将在整个应用程序中使用它。
但是我发现每当我从继承的类访问它时程序就会终止。
class SetupUIClass{
public:
SetupUIClass(std::string builderResourceString, Glib::ustring baseWidgetName){
}
SetupUIClass(Glib::RefPtr<Gtk::Builder> builder, Glib::ustring baseWidgetName){
this->builder = builder2;
//Point A
}
protected :
Glib::RefPtr<Gtk::Builder> builder;
}
class MyApplicationWindow: public SetupUIClass, public Gtk::ApplicationWindow{
public:
MyApplicationWindow(std::string builderResourceString, Glib::ustring baseWidgetName){
SetupUIClass(builderResourceString, baseWidgetName);
Glib::RefPtr<Gtk::Builder> builder2 = Gtk::Builder::create_from_resource(builderResourceString);
//Point B
MyApplicationWindow(builder2, baseWidgetName);
}
MyApplicationWindow(Glib::RefPtr<Gtk::Builder> builder2, Glib::ustring baseWidgetName){
//Point C
}
}
所以这个变量builder
保存了指向 gtkbuilder 的指针。
我builder->get_widget(widgetname, somewidgetpointer)
用来检查我的程序是否运行正常。
在Point BI可以builder2->
使用本地创建的指针,程序继续运行。
然后程序进入 A 点,在这里我调用了超级构造函数,在 A 点,我可以同时执行builder2->
和this->builder->
,它们分别是传递给构造函数的指针和受保护的变量,程序继续运行。
但是,当我到达 C 点时,它只能访问继承的受保护指针,当我这样做时this->builder->get_widget
,程序停止,没有任何输出或错误抛出。
我为此挠头。是不是我做错了什么?
- 继承的类不能访问继承的保护指针指向的地址?
- Refpointer 清理了自己并且 gtk 构建器的生命周期结束了?
- 地址更改为从一个班级到另一个班级?
任何帮助将不胜感激。或者,如果我一直在做错事,请指出。
更新
我做了一些进一步的检查,if(builder)
在 C 点返回 false 而不是 A 点,这就是导致问题的原因。但是我不应该已经将构建器变量存储在超类构造函数中吗?
在Glib 文档中,它声明它允许复制。