Ошибка C++ при доступе к типам членов класса ⇐ C++
-
Anonymous
Ошибка C++ при доступе к типам членов класса
Это упрощенный (несколько надуманный) пример проблемы с сегментацией, с которой я столкнулся в более крупной базе кода. https://godbolt.org/
По сути, он включает в себя серию производных классов, вызывающих различные методы класса на каждом уровне наследования. Если я раскомментирую строку в Parent::doSomething(), которая пытается использовать член класса Parent (anotherNumber), получится в ошибке сегмента (невозможно получить доступ к защищенной памяти по адресу). Похоже, где-то происходит какое-то классовое разделение?
#include #include #include #include #include шаблон структура CallbackRegistry { CallbackRegistry(Дочерний и дочерний) { RegisterCallback([&](автоматическое значение) { child.doSomethingElse(value); }); } void callCallback (целое значение) { если (обратный вызов_) { обратный вызов_->оператор()(значение); } } частный: std::optional callback_{}; void RegisterCallback(std::function обратный вызов) { callback_ = std::move(обратный вызов); } }; структура GrandParent { ГрандРодитель() = по умолчанию; виртуальный ~GrandParent() = по умолчанию; виртуальная недействительность получения сообщения (целое значение) = 0; }; шаблон struct Parent: публичный GrandParent { Parent() : GrandParent{}, callbackRegistry_(*dynamic_cast(this)) { } ~Parent() переопределить = по умолчанию; переопределение void полученияMessage(int value) { callbackRegistry_.callCallback(значение); } защищено: void doSomething (целое значение) { std::cout
Это упрощенный (несколько надуманный) пример проблемы с сегментацией, с которой я столкнулся в более крупной базе кода. https://godbolt.org/
По сути, он включает в себя серию производных классов, вызывающих различные методы класса на каждом уровне наследования. Если я раскомментирую строку в Parent::doSomething(), которая пытается использовать член класса Parent (anotherNumber), получится в ошибке сегмента (невозможно получить доступ к защищенной памяти по адресу). Похоже, где-то происходит какое-то классовое разделение?
#include #include #include #include #include шаблон структура CallbackRegistry { CallbackRegistry(Дочерний и дочерний) { RegisterCallback([&](автоматическое значение) { child.doSomethingElse(value); }); } void callCallback (целое значение) { если (обратный вызов_) { обратный вызов_->оператор()(значение); } } частный: std::optional callback_{}; void RegisterCallback(std::function обратный вызов) { callback_ = std::move(обратный вызов); } }; структура GrandParent { ГрандРодитель() = по умолчанию; виртуальный ~GrandParent() = по умолчанию; виртуальная недействительность получения сообщения (целое значение) = 0; }; шаблон struct Parent: публичный GrandParent { Parent() : GrandParent{}, callbackRegistry_(*dynamic_cast(this)) { } ~Parent() переопределить = по умолчанию; переопределение void полученияMessage(int value) { callbackRegistry_.callCallback(значение); } защищено: void doSomething (целое значение) { std::cout
Мобильная версия