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

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

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

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

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

22 ответов

9 просмотров

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Добрый день! Такая проблема возникла, написал код на Python, который компилирует, собирает и запускает файлы .s А в случае работы нужно то же самое делать для .asm Чем эти фа...
A Mori
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Карта сайта