继承共享指针失败了get_widget

时间:2017-07-14 05:22:56

标签: c++ inheritance shared-ptr gtkbuilder gtkmm3

我在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)检查我的程序是否正常运行。

在B点,我可以builder2->使用本地创建的指针,程序继续运行。

然后程序进入A点,在那里我调用超级构造函数,在A点,我可以同时执行builder2->this->builder->,它们分别是传递给构造函数的指针和受保护的变量,程序继续运行。

然而,当我到达C点时,它只能访问继承的受保护指针,当我执行this->builder->get_widget时,程序会停止而不会抛出任何输出或错误。

我正在摸索着这个。我做错了吗?

  • 继承的类无法访问由继承的受保护指针指向的地址吗?
  • Refpointer自行清理,gtk构建器的生命周期结束了吗?
  • 地址从一个班级改为另一个班级?

任何帮助将不胜感激。或者,如果我在整个时间做错事,请指出。

更新 我做了一些进一步的检查,if(builder)在C点返回false,但不是A点,这就是导致问题的原因。但是,我不应该已经在超类构造函数中存储了构建器变量吗?

Glib documentation中声明它允许复制。

1 个答案:

答案 0 :(得分:0)

似乎我被调用基类构造函数的其他一些堆栈帖子误导了。使用可能正确的初始化方法后

MyApplicationWindow::MyApplicationWindow(Glib::RefPtr<Gtk::Builder> builder2, Glib::ustring baseWidgetName):SetupUIClass(builder2, baseWidgetName){

而不是

MyApplicationWindow(std::string builderResourceString, Glib::ustring baseWidgetName){
    SetupUIClass(builderResourceString, baseWidgetName);

这个问题似乎已经解决了。