170 похожих чатов

Пытаюсь сделать стейт паттер на С++ и чет говно какое-то

выходит.
1) В примерах стейт оперирует паблик методами контекста, а это какая-то хрень. Мне же нужен доступ к приватным полям =\
2) В примерах стейт каждый раз создается динамически, я не хочу такого, получается надо массив этого всего иметь.
3) Контекст должен знать о стейте, стейт должен знать о контексте - циркулярная зависимость в хидерах

Чет идея хорошая, а реализация - дикие макароны получается.
ЧЯДНТ?

Я вообще слыхал что за стейт паттерн где-то могут убить, но не думаю что это из-за проблем выше или из-за них?

22 ответов

25 просмотров

ну, смотри, проблемы доступа к состояния легко решаются за счет создания вложенных классов. объясню на пальцах: #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(); } как видишь, С++ позволяет лаконично описать этот паттерн

SetPf
Спс.

Знал бы, что ты такой экономный, тоже бы с сокращениями бы код написал ;)

SetPf- Автор вопроса
Anatoly Shirokov
Знал бы, что ты такой экономный, тоже бы с сокраще...

Ну млин, не догадывался, что это может кого-то задеть. Спасибо.

SetPf- Автор вопроса
Anatoly Shirokov
ну, смотри, проблемы доступа к состояния легко реш...

Я вот пытаюсь это сделать в разных файлах.

SetPf- Автор вопроса
SetPf
Я вот пытаюсь это сделать в разных файлах.

Вот может кто подскажет, как правильно эту штуку разнести по файлам разным? Сохранив скоупы.

SetPf
Вот может кто подскажет, как правильно эту штуку р...

А какова конкретика по ТЗ? А то всё по чату размазано, не понятно ничего

SetPf- Автор вопроса
SetPf
Я вот пытаюсь это сделать в разных файлах.

Я хочу реализовать стейт паттерн без дин выделения. Как его сделать в одном классе, показал @anatol ijs в посте (прилепил). Я сейчас пытаюсь это разнести по файлам, но чет жопа.

SetPf
Я хочу реализовать стейт паттерн без дин выделения...

Гм Если стандарт c++17 и выше - можно описать через variant + visit У меня на работе так большинство стейт-машин описано

SetPf- Автор вопроса
Aliaksandr Onishchuk
Гм Если стандарт c++17 и выше - можно описать чере...

С++11 (ну кое что жрет из 14 и 17, но я хз полный список) И с этими штуками не знаком.

SetPf
С++11 (ну кое что жрет из 14 и 17, но я хз полный ...

Это в академических целях или жёсткие требования сверху?

SetPf- Автор вопроса
Aliaksandr Onishchuk
Грустная история

Да лан. С++14 уже устаревшее говно считается?

SetPf
Да лан. С++14 уже устаревшее говно считается?

УЕ4 вроде до сих пор на 14 стандарте. Да и куча корпоративного софта до сих пор на нем

SetPf
Да лан. С++14 уже устаревшее говно считается?

Как сказать Много фишечек облегчающих жизнь появилось в 17 стандарте Чего стоят трейты и их хэлперы std::is_*_v Я прямо сейчас прогаю на прод в 14 стандарте, всего в общем хватает, но т.к. взят курс на вынесение в компайл-тайм по максимуму всего что возможно - возможностей не хватает по сравнению с 17 Не говно, много прода сейчас на нём сидит, но уже тесновато

SetPf- Автор вопроса
Aliaksandr Onishchuk
А в чем проблема разнесения?

Я хз как объявить наследники State, что бы они были внутри скоупа Driver

SetPf
Я хз как объявить наследники State, что бы они был...

Нужны наследники state в пространстве класса Drived?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта