выходит.
1) В примерах стейт оперирует паблик методами контекста, а это какая-то хрень. Мне же нужен доступ к приватным полям =\
2) В примерах стейт каждый раз создается динамически, я не хочу такого, получается надо массив этого всего иметь.
3) Контекст должен знать о стейте, стейт должен знать о контексте - циркулярная зависимость в хидерах
Чет идея хорошая, а реализация - дикие макароны получается.
ЧЯДНТ?
Я вообще слыхал что за стейт паттерн где-то могут убить, но не думаю что это из-за проблем выше или из-за них?
ну, смотри, проблемы доступа к состояния легко решаются за счет создания вложенных классов. объясню на пальцах: #include <memory> class connection { struct state { connection* context_; state(connection* context) : context_(context) {} virtual ~state() = default; virtual void connect() = 0; virtual void disconnect() = 0; }; struct disconnected : state { using state::state; virtual void connect() override; virtual void disconnect() override; }; struct connected : state { using state::state; virtual void connect() override; virtual void disconnect() override; }; public: ~connection() {try {disconnect();} catch(...){}} void connect() { state_->connect(); } void disconnect() { state_->disconnect(); } private: std::unique_ptr<state> state_ = std::make_unique<disconnected>(this); }; void connection::disconnected::connect() { context_->state_ = std::make_unique<connection::connected>(context_); } void connection::disconnected::disconnect() { } void connection::connected::connect() { } void connection::connected::disconnect() { context_->state_ = std::make_unique<connection::disconnected>(context_); } int main() { connection c; c.connect(); c.disconnect(); } как видишь, С++ позволяет лаконично описать этот паттерн
Знал бы, что ты такой экономный, тоже бы с сокращениями бы код написал ;)
Ну млин, не догадывался, что это может кого-то задеть. Спасибо.
Ну, я вроде смайлик поставил
Я вот пытаюсь это сделать в разных файлах.
Вот может кто подскажет, как правильно эту штуку разнести по файлам разным? Сохранив скоупы.
А какова конкретика по ТЗ? А то всё по чату размазано, не понятно ничего
Я хочу реализовать стейт паттерн без дин выделения. Как его сделать в одном классе, показал @anatol ijs в посте (прилепил). Я сейчас пытаюсь это разнести по файлам, но чет жопа.
Гм Если стандарт c++17 и выше - можно описать через variant + visit У меня на работе так большинство стейт-машин описано
С++11 (ну кое что жрет из 14 и 17, но я хз полный список) И с этими штуками не знаком.
Это в академических целях или жёсткие требования сверху?
Это практические реалии =)
Грустная история
Да лан. С++14 уже устаревшее говно считается?
УЕ4 вроде до сих пор на 14 стандарте. Да и куча корпоративного софта до сих пор на нем
Как сказать Много фишечек облегчающих жизнь появилось в 17 стандарте Чего стоят трейты и их хэлперы std::is_*_v Я прямо сейчас прогаю на прод в 14 стандарте, всего в общем хватает, но т.к. взят курс на вынесение в компайл-тайм по максимуму всего что возможно - возможностей не хватает по сравнению с 17 Не говно, много прода сейчас на нём сидит, но уже тесновато
Ща глянул, variant имеется
А в чем проблема разнесения?
Я хз как объявить наследники State, что бы они были внутри скоупа Driver
Нужны наследники state в пространстве класса Drived?
Обсуждают сегодня