Я использую базовый класс в C ++ для имитации интерфейса в Java, поэтому мне не нужно повторять какой-то код или создавать объект для каждого другого класса, который я создаю.
В основном он содержит RefPtr для GtkBuilder, который я буду использовать в приложении.
Но я обнаружил, что программа завершается всякий раз, когда я обращаюсь к ней из унаследованного класса.
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->
который использует локально созданный указатель, программа продолжает работать.
Затем программа переходит в точку А, где я назвал супер-конструктор, в точке А я могу сделать оба builder2->
а также this->builder->
, которые являются соответственно указателем, переданным в конструктор и защищенную переменную, программа продолжает выполняться.
однако, когда я достигаю точки C, где он может получить доступ только к унаследованному защищенному указателю, когда я делаю this->builder->get_widget
, программа останавливается без вывода или ошибки.
Я почесал голову над этим. Что-то я не так сделал?
Любая помощь будет оценена. Или, может быть, укажите, если я все время делаю что-то не так.
ОБНОВИТЬ
Я сделал дополнительную проверку, if(builder)
вернул false в точке C, но не в точке A, что и стало причиной проблемы. Но разве я не должен хранить переменную построителя уже в конструкторе суперкласса?
в Глеб документация он заявляет, что позволяет копировать.
кажется, я был введен в заблуждение некоторыми другими сообщениями стека синтаксиса вызова конструктора базового класса. после использования возможно правильного метода инициализации
MyApplicationWindow::MyApplicationWindow(Glib::RefPtr<Gtk::Builder> builder2, Glib::ustring baseWidgetName):SetupUIClass(builder2, baseWidgetName){
вместо
MyApplicationWindow(std::string builderResourceString, Glib::ustring baseWidgetName){
SetupUIClass(builderResourceString, baseWidgetName);
эта конкретная проблема кажется решенной.
Других решений пока нет …