выходит.
                  
                  
                  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(); } как видишь, С++ позволяет лаконично описать этот паттерн
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Знал бы, что ты такой экономный, тоже бы с сокращениями бы код написал ;)
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Ну млин, не догадывался, что это может кого-то задеть. Спасибо.
Ну, я вроде смайлик поставил
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Я вот пытаюсь это сделать в разных файлах.
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Вот может кто подскажет, как правильно эту штуку разнести по файлам разным? Сохранив скоупы.
А какова конкретика по ТЗ? А то всё по чату размазано, не понятно ничего
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Я хочу реализовать стейт паттерн без дин выделения. Как его сделать в одном классе, показал @anatol ijs в посте (прилепил). Я сейчас пытаюсь это разнести по файлам, но чет жопа.
Гм Если стандарт c++17 и выше - можно описать через variant + visit У меня на работе так большинство стейт-машин описано
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  С++11 (ну кое что жрет из 14 и 17, но я хз полный список) И с этими штуками не знаком.
Это в академических целях или жёсткие требования сверху?
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Это практические реалии =)
Грустная история
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Да лан. С++14 уже устаревшее говно считается?
УЕ4 вроде до сих пор на 14 стандарте. Да и куча корпоративного софта до сих пор на нем
Как сказать Много фишечек облегчающих жизнь появилось в 17 стандарте Чего стоят трейты и их хэлперы std::is_*_v Я прямо сейчас прогаю на прод в 14 стандарте, всего в общем хватает, но т.к. взят курс на вынесение в компайл-тайм по максимуму всего что возможно - возможностей не хватает по сравнению с 17 Не говно, много прода сейчас на нём сидит, но уже тесновато
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Ща глянул, variant имеется
А в чем проблема разнесения?
 SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          SetPf
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Я хз как объявить наследники State, что бы они были внутри скоупа Driver
Нужны наследники state в пространстве класса Drived?
Обсуждают сегодня