2017-07-14 2 views
0

私は、Javaでインタフェースを模倣するためにC++の基本クラスを使用していますので、私はいくつかのコードを繰り返す必要はありません。継承された共有ポインタがget_widgetに失敗しました

基本的には、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で、それぞれコンストラクタと保護された変数に渡されるポインタであるbuilder2->this->builder->の両方を実行できます。プログラムは引き続き実行されます。

しかし、私がthis->builder->get_widgetを実行すると、継承された保護されたポインタにしかアクセスできないポイントCに到達すると、プログラムは出力もエラーもスローされずに停止します。

私はこれ以上頭を傷つけています。私が間違っていたことはありますか?

  • 継承されたクラスは継承された保護されたポインタによって指し示されたアドレスにアクセスできませんか?
  • Refpointer自体がクリーニングされ、gtkビルダーのライフサイクルが終了しましたか?
  • 住所があるクラスから別のクラスに変更されましたか?

助けてください。あるいは、私が何か間違ったことをしていると指摘しているかもしれません。

UPDATE は私がif(builder)が指していたが、点Cでfalseが返され、さらにいくつかのチェックをした、それが問題の原因です。しかし、スーパークラスのコンストラクタにすでにビルダー変数を格納してはいけませんか?

Glib documentationには、コピーできることが記載されています。

答えて

0

私は基本クラスのコンストラクタを呼び出す構文のいくつかの他のスタックポストに惑わされているようです。特定の問題が解決思われることでしょう、適切な初期化メソッド

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

代わりの

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

を使用した後。

関連する問題