Advertisement
selebry

dsadsa

May 27th, 2022
582
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <string>//Импорт библиотеки string для использования класса string и его методов
  3. #include <vector>//Импорт библиотеки vector для использования класса vector и его методов
  4. #include <iostream>//Импорт библиотеки iostream для использования объектов потока ввода и вывода cin и cout
  5. #include <iomanip>//Импорт библиотеки iostream для использования объектов потока ввода и вывода cin и cout
  6. #include <sstream>
  7. #include <map>
  8. using namespace std;//Использование пространства имен Standart
  9.  
  10. class System;
  11. #define def_signal(s) void(System::*s)(string&)
  12. #define def_handler(h) void(System::*h)(string)
  13. typedef def_signal(type_signal);
  14. typedef def_handler(type_handler);
  15.  
  16.  
  17. class System {//Класс System - Базовый класс
  18.     string obj_name = "";//Объявление закрытого свойства строкового типа- имя объекта
  19.     System* head_obj, * curr_obj, * root_obj;//Объявление закрытого свойства типа указатель на объект System - указатель на головной объек
  20.     int state = 0, class_id = 1;//Объявление закрытого свойства типа класс Status - статус готовности объекта
  21.     vector <System*> sub_objs;//Объявление закрытого свойства типа массив вектор типа указатель на System - массив подчиненных объектов
  22.     struct Connection {//Структура Connection - структура, которая хранит данные о соездинении объектов
  23.         System* source, * destination;
  24.         string message;
  25.         type_signal signal;
  26.         type_handler handler;
  27.     };
  28.     vector<Connection*> connections;
  29. public:
  30.     //Особые методы класса (конструктор и деструктор)
  31.     System(System* head_obj = nullptr, string obj_name = "System");//Объявление параметризированного конструктора
  32.     ~System();//Объявление деструктора
  33.     //Взаимодействие со свойствами объектов
  34.     void set_obj_name(string obj_name);//Объявление метода set_obj_name - установка имени объекта
  35.     string get_obj_name();//Объявление метода get_obj_name - получение имени объекта
  36.     void set_state(int state);//Объявление метода set_state - установка состояния объекта
  37.     int get_state();//Объявление метода get_state - получение состояние объекта
  38.     //void set_class_id(int class_id);
  39.     //int get_class_id();
  40.     //Взаимодействие с полями-объектами класса System
  41.     void set_head_obj(System* head_obj);//Объявление метода set_head_obj -  установка головного объекта
  42.     System* get_head_obj();//Объявление метода get_head_obj - получение головного объекта
  43.     System* get_root_obj();
  44.     void set_curr_obj(System* obj);
  45.     System* get_curr_obj();
  46.     //Взамодействие с координатами объектов
  47.     System* find_obj(string path);
  48.     System* get_obj_by_name(string obj_name);//Объвление метода get_obj_by_name- получение объекта по имени
  49.     System* get_obj_by_absolute_path(string path);
  50.     string get_absolute_path(System* obj);
  51.     System* get_obj_by_relative_path(string path);
  52.     //Взаимодействие с древом объектов и их готовностью
  53.     bool up_tree_ready();
  54.     void set_tree_as_ready();
  55.     void print_tree(int level_ie = 0);//Объявлние метода print_tree - печать дерева
  56.     void print_status_tree(int level_ie = 0);//Объявлние метода print_tree - печать дерева
  57.     //Взаимодействие с сигналами-обработчиками объектов
  58.     void set_connect(def_signal(s), System* target_obj, def_handler(h));
  59.     void delete_connect(def_signal(s), System* target_obj, def_handler(h));
  60.     void output_signal(def_signal(s), string message);
  61. };
  62.  
  63. //------------------------------------//
  64. //Особые методы класса (конструктор и деструктор)
  65. //------------------------------------//
  66. System::System(System* head_obj, string obj_name)//Реализация конструктора с параметрами
  67.     :head_obj(head_obj), obj_name(obj_name), state(0), curr_obj(this), root_obj(this)//Присваивание закрым полям значнеия параметров
  68. {
  69.     if (head_obj) head_obj->sub_objs.push_back(this);//Если у переданного объекта есть головной объект, то добавляем текущий объект к подчиненным объектам переданного объекта
  70.     root_obj = get_root_obj();
  71. }
  72.  
  73. System::~System() {//Реализация деструктора
  74.     delete head_obj;//Удаляем головной объект
  75.     sub_objs.clear();//Очищаем подчиенные объекты
  76.     connections.clear();
  77. }
  78. //------------------------------------//
  79. //Взаимодействие со свойствами объектов
  80. //------------------------------------//
  81. void System::set_obj_name(string obj_name) {//Реализация set_obj_name
  82.     this->obj_name = obj_name;//Присваивание закрытому полю класса имя объекта параметру
  83. }
  84.  
  85. string System::get_obj_name() {//Реализация get_obj_name
  86.     return obj_name;//Возврат имени объекта
  87. }
  88.  
  89. void System::set_state(int state) {//Реализация set_state
  90.     if (state != 0) {
  91.         if (!up_tree_ready()) return;
  92.         this->state = state;
  93.     }
  94.     else {
  95.         this->state = state;
  96.         for (int i = 0; i < sub_objs.size(); i++) {
  97.             sub_objs[i]->set_state(0);
  98.         }
  99.     }
  100. }
  101.  
  102. int System::get_state() {//Реализация get_state
  103.     return state;
  104. }
  105.  
  106. //void System::set_class_id(int class_id) {
  107. //  this->class_id = class_id;
  108. //}
  109.  
  110. //int System::get_class_id() {
  111. //  return class_id;
  112. //}
  113. //------------------------------------//
  114. //Взаимодействие с полями-объектами класса System
  115. //------------------------------------//
  116. void System::set_head_obj(System* head_obj) {//Реализация set_head_obj
  117.     if (head_obj) {
  118.         this->head_obj = head_obj;//Присваивание закрытому полю класса головной объект параметру
  119.         head_obj->sub_objs.push_back(this);
  120.     }
  121. }
  122.  
  123. System* System::get_head_obj() {//Реализация get_obj_name
  124.     return head_obj;//Возврат головного объекта
  125. }
  126.  
  127. System* System::get_root_obj() {
  128.     //if(!root_obj->head_obj) return root_obj;
  129.     while (root_obj->head_obj) {
  130.         root_obj = root_obj->head_obj;
  131.     }
  132.     return root_obj;
  133. }
  134.  
  135. void System::set_curr_obj(System* obj) {
  136.     if (obj) curr_obj = obj;
  137. }
  138.  
  139. System* System::get_curr_obj() {
  140.     return curr_obj;
  141. }
  142. //------------------------------------//
  143. //Взамодействие с координатами объектов
  144. //------------------------------------//
  145. vector<string> split_string(string s, char dec = '/') {
  146.     vector<string> array_words;
  147.     stringstream strstream(s);
  148.     string el;
  149.     while (getline(strstream, el, dec))
  150.         if (!el.empty())array_words.push_back(el);
  151.     return array_words;
  152. }
  153.  
  154. System* System::find_obj(string path) {
  155.     if (path[0] == '/') {
  156.         if (path.size() == 1) return root_obj;
  157.         if (path[1] == '/') return get_obj_by_name(path.substr(2));
  158.         return get_obj_by_absolute_path(path);
  159.     }
  160.     if (path[0] == '.') return curr_obj;
  161.     return get_obj_by_relative_path(path);
  162. }
  163.  
  164. System* System::get_obj_by_name(string obj_name) {//Реализация get_obj_name
  165.     //Если подчиненных объектов нет, то нет смысла искать дальше
  166.     if (this->obj_name == obj_name) return this;
  167.     for (int i = 0; i < sub_objs.size(); i++) {//Цикл для перебора подчиненных объектов
  168.         if (sub_objs[i]->get_obj_by_name(obj_name)->get_obj_name() == obj_name) {
  169.             return sub_objs[i]->get_obj_by_name(obj_name);
  170.         }
  171.     }
  172.     return this;
  173. }
  174.  
  175. System* System::get_obj_by_absolute_path(string path) {
  176.     System* obj_find = this;
  177.     vector<string> path_vector = split_string(path);
  178.     for (int i = 0; i < path_vector.size(); i++) {
  179.         System* prev = obj_find;
  180.         for (int j = 0; j < obj_find->sub_objs.size(); j++) {
  181.             if (obj_find->sub_objs[j]->get_obj_name() == path_vector[i]) {
  182.                 obj_find = obj_find->sub_objs[j];
  183.                 break;
  184.             }
  185.         }
  186.         if (prev == obj_find) return nullptr;
  187.     }
  188.     return obj_find;
  189. }
  190.  
  191. string System::get_absolute_path(System* obj) {
  192.     if (!obj) return string();
  193.     string path = "";
  194.     vector<string> path_vector;
  195.     while (obj->head_obj) {
  196.         path_vector.push_back(obj->obj_name);
  197.         obj = obj->head_obj;
  198.     }
  199.     for (int i = path_vector.size() - 1; i >= 0; i--) path += path_vector[i] + ((i > 0) ? "/" : "");
  200.     return "/" + path;
  201. }
  202.  
  203. System* System::get_obj_by_relative_path(string path) {
  204.     System* obj_find = curr_obj;
  205.     vector<string> path_vector = split_string(path);
  206.     for (int i = 0; i < path_vector.size(); i++) {
  207.         System* prev = obj_find;
  208.         for (int j = 0; j < obj_find->sub_objs.size(); j++) {
  209.             if (obj_find->sub_objs[j]->get_obj_name() == path_vector[i]) {
  210.                 obj_find = obj_find->sub_objs[j];
  211.                 break;
  212.             }
  213.         }
  214.         if (prev == obj_find) return nullptr;
  215.     }
  216.     return obj_find;
  217. }
  218. //------------------------------------//
  219. //Взаимодействие с древом объектов и их готовностью
  220. //------------------------------------//
  221. string inline operator*(string s, int count) {
  222.     string res;
  223.     for (int i = 0; i < count; i++) res += s;
  224.     return res;
  225. }
  226.  
  227. bool System::up_tree_ready() {
  228.     if (head_obj) {
  229.         if (head_obj->state == 0) return false;
  230.         head_obj->up_tree_ready();
  231.     }
  232.     return true;
  233. }
  234.  
  235. void System::set_tree_as_ready() {
  236.     this->set_state(1);
  237.     if (sub_objs.empty()) return;
  238.     for (int i = 0; i < sub_objs.size(); i++)
  239.         sub_objs[i]->set_tree_as_ready();
  240. }
  241.  
  242. void System::print_tree(int level_ie) {//Реализация print_tree
  243.     cout << '\n';
  244.     cout << string(" ") * (level_ie * 4);
  245.     cout << this->obj_name;
  246.     if (sub_objs.empty()) return;
  247.     for (int i = 0; i < sub_objs.size(); i++)
  248.         sub_objs[i]->print_tree(level_ie + 1);
  249. }
  250.  
  251. void System::print_status_tree(int level_ie) {//Реализация print_tree
  252.     cout << '\n';
  253.     cout << string(" ") * (level_ie * 4);
  254.     cout << this->obj_name;
  255.     (this->state != 0) ? cout << " is ready" : cout << " is not ready";
  256.     if (sub_objs.empty()) return;
  257.     for (int i = 0; i < sub_objs.size(); i++)
  258.         sub_objs[i]->print_status_tree(level_ie + 1);
  259. }
  260. //------------------------------------//
  261. //Взаимодействие с сигналами-обработчиками объектов
  262. //------------------------------------//
  263. void System::set_connect(def_signal(s), System* target_obj, def_handler(h))
  264. {
  265.     /*for (auto it = root_obj->connections.begin(); it < root_obj->connections.end(); ++it)
  266.     {
  267.         if ((*it)->signal == s && (*it)->handler == h && (*it)->destination == target_obj) {
  268.             return;
  269.         }
  270.     }*/
  271.     root_obj->connections.push_back(new Connection{ this,target_obj,"",s,h });
  272. }
  273.  
  274. void System::delete_connect(def_signal(s), System* target_obj, def_handler(h))
  275. {
  276.     for (auto it = root_obj->connections.begin(); it < root_obj->connections.end(); ++it)
  277.     {
  278.         if ((*it)->signal == s && (*it)->handler == h && (*it)->destination == target_obj) {
  279.             root_obj->connections.erase(it);
  280.             //break;
  281.         }
  282.     }
  283. }
  284.  
  285. void System::output_signal(def_signal(s), string message) {
  286.     if (state == 0 || root_obj->connections.empty()) return;
  287.     message = message.substr(1);
  288.     (this->*s)(message);
  289.     for (Connection* con : root_obj->connections) {
  290.         if (con->signal == s)
  291.         {
  292.             if (con->destination->state != 0) {
  293.                 con->message = message;
  294.                 (con->destination->*(con->handler))(con->message);
  295.             }
  296.         }
  297.     }
  298. }
  299.  
  300. //------------------------------------//
  301. //------------SUB'S------------//
  302. //------------------------------------//
  303. class DataProcessor;
  304. class ControlPanel;
  305. class CardValidator;
  306. class MoneyAccepting;
  307. class MoneyIssuing;
  308. class ATM_console;
  309.  
  310. class CardValidator : public System {//Класс CardValidator - наследник System
  311.     struct card
  312.     {
  313.         string id;
  314.         unsigned short password;
  315.         unsigned long money;
  316.     };
  317.     vector<card*> cards_storage;
  318. public:
  319.     CardValidator(System* head_obj = nullptr, string obj_name = "card_validator");//Конструктор
  320.    
  321.     void signal(string& message);
  322.     void handler(string message);
  323.     void add_card(string id, unsigned short password, unsigned long money)
  324.     {
  325.         cards_storage.push_back(new card{ id,password,money });
  326.     }
  327.     bool check_number_card(string id);
  328.     bool check_password(string id, unsigned short password);
  329. };
  330.  
  331.  
  332. CardValidator::CardValidator(System* head_obj, string obj_name) : System(head_obj, obj_name) {};//>=AB@C:B>@
  333. void CardValidator::signal(string& message)
  334. {
  335.     cout << "\nSignal from " << get_root_obj()->get_absolute_path(this);
  336.     message += " (class: 3)";
  337. }
  338. void CardValidator::handler(string message)
  339. {
  340.     cout << "\nSignal to " << get_root_obj()->get_absolute_path(this) << " Text:  " << message;
  341. }
  342.  
  343. class MoneyAccepting : public System {//Класс MoneyAccepting - наследник System
  344.     int amount = 0;
  345. public:
  346.     MoneyAccepting(System* head_obj = nullptr, string obj_name = "money_accepting");//Конструктор
  347.     void signal(string& message);
  348.     void handler(string message)
  349.     {
  350.        
  351.     }
  352.     int sum_money(int rubles=0)
  353.     {
  354.         static int amount = 0;
  355.         if(rubles == 5000 || rubles == 2000 || rubles == 1000 || rubles == 500 || rubles == 100)
  356.         {
  357.             amount += rubles;
  358.         }
  359.         return amount;
  360.     }
  361.     void confirm_payment()
  362.     {
  363.         amount = sum_money();
  364.     }
  365. };
  366.  
  367.  
  368.  
  369. class MoneyIssuing : public System {//Класс MoneyIssuing - наследник System
  370.     struct banknotes
  371.     {
  372.         unsigned int _5000, _2000, _1000, _500, _100;
  373.     };
  374.     banknotes* count;
  375. public:
  376.     MoneyIssuing(System* head_obj = nullptr, string obj_name = "money_issuing");//Конструктор
  377.     void signal(string& message);
  378.     void handler(string message);
  379.     void set_count(unsigned int _5000, unsigned int _2000, unsigned int _1000, unsigned int _500, unsigned int _100)
  380.     {
  381.         count = new banknotes{ _5000, _2000, _1000, _500, _100 };
  382.     }
  383. };
  384.  
  385. MoneyIssuing::MoneyIssuing(System* head_obj, string obj_name) : System(head_obj, obj_name) {};//>=AB@C:B>@
  386. void MoneyIssuing::signal(string& message)
  387. {
  388.     cout << "\nSignal from " << get_root_obj()->get_absolute_path(this);
  389.     message += " (class: 5)";
  390. }
  391. void MoneyIssuing::handler(string message)
  392. {
  393.     cout << "\nSignal to " << get_root_obj()->get_absolute_path(this) << " Text:  " << message;
  394. }
  395.  
  396. class ControlPanel : public System {//Класс ControlPanel - наследник System
  397. public:
  398.     ControlPanel(System* head_obj = nullptr, string obj_name = "control_panel");//Конструктор
  399.     void signal(string& message);
  400.     void handler(string message);
  401.     void fill_bank(vector <string> data_vec, MoneyIssuing* money_issuing)
  402.     {
  403.         money_issuing->set_count(stoi(data_vec[0]), stoi(data_vec[1]), stoi(data_vec[2]), stoi(data_vec[3]), stoi(data_vec[4]));
  404.     }
  405.     void append_new_card(vector <string> data_vec, CardValidator* card_validator)
  406.     {
  407.         card_validator->add_card(data_vec[0] + " " + data_vec[1] + " " + data_vec[2] + " " + data_vec[3], stoi(data_vec[4]), stoi(data_vec[5]));
  408.     }
  409. };
  410.  
  411. ControlPanel::ControlPanel(System* head_obj, string obj_name) : System(head_obj, obj_name) {};//>=AB@C:B>@
  412. void ControlPanel::signal(string& message)
  413. {
  414.     cout << "\nSignal from " << get_root_obj()->get_absolute_path(this);
  415.     message += " (class: 2)";
  416. }
  417. void ControlPanel::handler(string message)
  418. {
  419.     cout << "\nSignal to " << get_root_obj()->get_absolute_path(this) << " Text:  " << message;
  420. }
  421.  
  422. class DataProcessor : public System {//Класс DataProcessor - наследник System
  423. public:
  424.     DataProcessor(System* head_obj = nullptr, string obj_name = "data_processor");
  425.     void signal(string& message);
  426.     void handler(string message);
  427.     void preparation_ATM(string data_input,System* root, ControlPanel* control_panel,CardValidator* card_validator, MoneyIssuing* money_issuing)
  428.     {
  429.         static bool isCardLoadingEnd = false;
  430.         if (data_input == "End card loading") isCardLoadingEnd = true;
  431.        
  432.         vector<string> card_data = split_string(data_input, ' ');
  433.         if (isCardLoadingEnd) {
  434.             control_panel->fill_bank(card_data, money_issuing);
  435.             root->set_state(1);
  436.             root->output_signal(static_cast<void(System::*)(string&)>(&DataProcessor::signal), "Ready to work");
  437.         }
  438.         else control_panel->append_new_card(card_data, card_validator);
  439.        
  440.        
  441.     }
  442.     void call_system(System* root, ControlPanel* control_panel, CardValidator* card_validator, MoneyIssuing* money_issuing)
  443.     {
  444.         string data_input, n_card;
  445.         bool isCardInsert = false, isCardValid = false;
  446.        
  447.         getline(cin, data_input);
  448.         while(data_input!="Turn off the ATM")
  449.         {
  450.             vector<string> command_vector = split_string(data_input, ' ');
  451.             if(command_vector[0]=="Identification")
  452.             {
  453.                 if (root->get_state() == 1) {
  454.                     n_card = command_vector[1] + " " + command_vector[2] + " " + command_vector[3] + " " + command_vector[4];
  455.                     if (card_validator->check_number_card(n_card))
  456.                     {
  457.                         root->set_state(2);
  458.                         isCardInsert = true;
  459.                         cout << "\nEnter the PIN code";
  460.                     }
  461.                     else
  462.                         root->set_state(1);
  463.                 }
  464.             }
  465.             else if(command_vector[0]=="PIN-code")
  466.             {
  467.                 if(isCardInsert)
  468.                 {
  469.                     card_validator->check_password(n_card, stoi(command_vector[1]));
  470.                     isCardValid = true;
  471.                 }
  472.             }
  473.             else if(command_vector[0]=="Deposit")
  474.             {
  475.                 if(data_input=="Deposit money to the card")
  476.                 {
  477.                     //add money on card
  478.                 }
  479.                 else
  480.                 {
  481.                     banknote = stoi(command_vector[command_vector.size() - 1]);
  482.                     if (banknote == 5000 || banknote == 2000 || banknote == 1000 || banknote == 500 || banknote == 100) {
  483.                         sum += banknote;
  484.                         cout << "\nThe amount: " << sum;
  485.                     }
  486.                 }
  487.             }
  488.         }
  489.  
  490.     }
  491. };
  492.  
  493. DataProcessor::DataProcessor(System* head_obj, string obj_name) : System(head_obj, obj_name) {};//>=AB@C:B>@
  494. void DataProcessor::signal(string& message)
  495. {
  496.     cout << "\nSignal from " << get_root_obj()->get_absolute_path(this);
  497.     message += " (class: 1)";
  498. }
  499. void DataProcessor::handler(string message)
  500. {
  501.     cout << "\nSignal to " << get_root_obj()->get_absolute_path(this) << " Text:  " << message;
  502. }
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514. class ATM_console : public System {//Класс ATM_console - наследник System
  515. public:
  516.     ATM_console(System* head_obj = nullptr, string obj_name = "atm_console");//Конструктор
  517.     void signal(string& message);
  518.     void handler(string message);
  519. };
  520.  
  521. ATM_console::ATM_console(System* head_obj, string obj_name) : System(head_obj, obj_name) {};//>=AB@C:B>@
  522. void ATM_console::signal(string& message)
  523. {
  524.     cout << "\nSignal from " << get_root_obj()->get_absolute_path(this);
  525.     message += " (class: 6)";
  526. }
  527. void ATM_console::handler(string message)
  528. {
  529.     cout << "\n" << message;
  530. }
  531.  
  532. class App : public System {//Класс App - приложение для строения дерева и его вывода
  533.     System* root = nullptr;
  534.     DataProcessor* data_processor = nullptr;
  535.     ControlPanel* control_panel = nullptr;
  536.     CardValidator* card_validator = nullptr;
  537.     MoneyAccepting* money_accepting = nullptr;
  538.     MoneyIssuing* money_issuing = nullptr;
  539.     ATM_console* atm_console = nullptr;
  540. public:
  541.     App(System* head = nullptr);//Объявление параметризированного конструктора
  542.     void build_tree_objs();//Объявление метода build_tree_objs - построение дерева объектов
  543.     void set_state_tree();
  544.     void call_system();
  545.     void call_signal_handler_system();
  546.     void set_connect_by_class_id(System* s, System* d, int class_id);
  547.     void delete_connect_by_class_id(System* s, System* d, int class_id);
  548.     int exec_app();//Объявление метода exec_app - запуск приложения
  549. };
  550.  
  551.  
  552. App::App(System* head) {
  553.     root = new System(head);
  554.     //root->set_class_id(1);
  555. }//Присваивание закрым полям значения параметров
  556. void App::build_tree_objs() {//Реализация методов build_tree_objs
  557.     data_processor = new DataProcessor(root);
  558.     control_panel = new ControlPanel(root);
  559.     card_validator = new CardValidator(root);
  560.     money_accepting = new MoneyAccepting(root);
  561.     money_issuing = new MoneyIssuing(root);
  562.     atm_console = new ATM_console(root);
  563.     root->set_connect(static_cast<void(System::*)(string&)>(&DataProcessor::signal), data_processor, static_cast<void(System::*)(string)>(&DataProcessor::handler));
  564.     root->set_connect(static_cast<void(System::*)(string&)>(&ControlPanel::signal), data_processor, static_cast<void(System::*)(string)>(&ControlPanel::handler));
  565.     root->set_connect(static_cast<void(System::*)(string&)>(&CardValidator::signal), data_processor, static_cast<void(System::*)(string)>(&CardValidator::handler));
  566.     root->set_connect(static_cast<void(System::*)(string&)>(&MoneyAccepting::signal), data_processor, static_cast<void(System::*)(string)>(&MoneyAccepting::handler));
  567.     root->set_connect(static_cast<void(System::*)(string&)>(&MoneyIssuing::signal), data_processor, static_cast<void(System::*)(string)>(&MoneyIssuing::handler));
  568.     root->set_connect(static_cast<void(System::*)(string&)>(&ATM_console::signal), data_processor, static_cast<void(System::*)(string)>(&ATM_console::handler));
  569. }
  570.  
  571. void App::set_state_tree() {
  572.     string obj_name;
  573.     int class_number;
  574.     while (cin >> obj_name >> class_number) {
  575.         root->get_obj_by_name(obj_name)->set_state(class_number);
  576.     }
  577. }
  578.  
  579. void App::call_system() {
  580.     string system_command, obj_path;
  581.     cin >> system_command;
  582.     while (system_command != "END") {
  583.         cin >> obj_path;
  584.         System* f = root->find_obj(obj_path);
  585.         if (system_command == "SET") {
  586.             if (f) {
  587.                 cout << "\nObject is set: " << f->get_obj_name();
  588.                 root->set_curr_obj(f);
  589.             }
  590.             else cout << "\nObject is not found: " << f->get_curr_obj()->get_obj_name() << " " << obj_path;
  591.         }
  592.         else if (system_command == "FIND") {
  593.             cout << '\n' << obj_path << string(" ") * 5;
  594.             if (f) cout << "Object name: " << f->get_obj_name();
  595.             else cout << "Object is not found";
  596.         }
  597.         cin >> system_command;
  598.     }
  599. }
  600.  
  601. void App::set_connect_by_class_id(System* s, System* d, int class_id) {
  602.     void (System:: * signal_par)(string&) = NULL;
  603.     void (System:: * handler_par)(string) = NULL;
  604.     switch (class_id)
  605.     {
  606.     case 1:
  607.         signal_par = static_cast<void(System::*)(string&)>(&DataProcessor::signal);
  608.         handler_par = static_cast<void(System::*)(string)>(&DataProcessor::handler);
  609.         break;
  610.     case 2:
  611.         signal_par = static_cast<void(System::*)(string&)>(&ControlPanel::signal);
  612.         handler_par = static_cast<void(System::*)(string)>(&ControlPanel::handler);
  613.         break;
  614.     case 3:
  615.         signal_par = static_cast<void(System::*)(string&)>(&CardValidator::signal);
  616.         handler_par = static_cast<void(System::*)(string)>(&CardValidator::handler);
  617.         break;
  618.     case 4:
  619.         signal_par = static_cast<void(System::*)(string&)>(&MoneyAccepting::signal);
  620.         handler_par = static_cast<void(System::*)(string)>(&MoneyAccepting::handler);
  621.         break;
  622.     case 5:
  623.         signal_par = static_cast<void(System::*)(string&)>(&MoneyIssuing::signal);
  624.         handler_par = static_cast<void(System::*)(string)>(&MoneyIssuing::handler);
  625.         break;
  626.     case 6:
  627.         signal_par = static_cast<void(System::*)(string&)>(&ATM_console::signal);
  628.         handler_par = static_cast<void(System::*)(string)>(&ATM_console::handler);
  629.         break;
  630.     default:
  631.         break;
  632.     }
  633.     s->set_connect(signal_par, d, handler_par);
  634. }
  635. void App::delete_connect_by_class_id(System* s, System* d, int class_id) {
  636.     void (System:: * signal_par)(string&) = NULL;
  637.     void (System:: * handler_par)(string) = NULL;
  638.     switch (class_id)
  639.     {
  640.     case 1:
  641.         signal_par = static_cast<void(System::*)(string&)>(&DataProcessor::signal);
  642.         handler_par = static_cast<void(System::*)(string)>(&DataProcessor::handler);
  643.         break;
  644.     case 2:
  645.         signal_par = static_cast<void(System::*)(string&)>(&ControlPanel::signal);
  646.         handler_par = static_cast<void(System::*)(string)>(&ControlPanel::handler);
  647.         break;
  648.     case 3:
  649.         signal_par = static_cast<void(System::*)(string&)>(&CardValidator::signal);
  650.         handler_par = static_cast<void(System::*)(string)>(&CardValidator::handler);
  651.         break;
  652.     case 4:
  653.         signal_par = static_cast<void(System::*)(string&)>(&MoneyAccepting::signal);
  654.         handler_par = static_cast<void(System::*)(string)>(&MoneyAccepting::handler);
  655.         break;
  656.     case 5:
  657.         signal_par = static_cast<void(System::*)(string&)>(&MoneyIssuing::signal);
  658.         handler_par = static_cast<void(System::*)(string)>(&MoneyIssuing::handler);
  659.         break;
  660.     case 6:
  661.         signal_par = static_cast<void(System::*)(string&)>(&ATM_console::signal);
  662.         handler_par = static_cast<void(System::*)(string)>(&ATM_console::handler);
  663.         break;
  664.     default:
  665.         break;
  666.     }
  667.     s->delete_connect(signal_par, d, handler_par);
  668. }
  669. void App::call_signal_handler_system()
  670. {
  671.     /*string system_command, obj_path, add_string;
  672.     void (System:: * signal_par)(string&) = NULL;
  673.     void (System:: * handler_par)(string) = NULL;
  674.     cin >> system_command;
  675.     while (system_command != "END") {
  676.         cin >> obj_path;
  677.         System* f = root->find_obj(obj_path);
  678.         if (system_command == "EMIT")
  679.         {
  680.             getline(cin, add_string);
  681.             if (f)
  682.             {
  683.                 switch (f->get_class_id())
  684.                 {
  685.                 case 1:
  686.                     signal_par = static_cast<void (System::*)(string&)>(&DataProcessor::signal);
  687.                     break;
  688.                 case 2:
  689.                     signal_par = static_cast<void (System::*)(string&)>(&ControlPanel::signal);
  690.                     break;
  691.                 case 3:
  692.                     signal_par = static_cast<void (System::*)(string&)>(&CardValidator::signal);
  693.                     break;
  694.                 case 4:
  695.                     signal_par = static_cast<void (System::*)(string&)>(&MoneyAccepting::signal);
  696.                     break;
  697.                 case 5:
  698.                     signal_par = static_cast<void (System::*)(string&)>(&MoneyIssuing::signal);
  699.                     break;
  700.                 case 6:
  701.                     signal_par = static_cast<void (System::*)(string&)>(&ATM_console::signal);
  702.                     break;
  703.                 default:
  704.                     break;
  705.                 }
  706.                 f->output_signal(signal_par, add_string);
  707.             }
  708.             else cout << "\nObject " << obj_path << " not found";
  709.         }
  710.         else if (system_command == "SET_CONNECT")
  711.         {
  712.             cin >> add_string;
  713.             if (f) {
  714.                 System* d = root->find_obj(add_string);
  715.                 if (d)set_connect_by_class_id(f, d, f->get_class_id());
  716.                 else cout << "\nHandler object " << add_string << " not found";
  717.             }
  718.             else cout << "\nObject " << obj_path << " not found";
  719.         }
  720.         else if (system_command == "DELETE_CONNECT")
  721.         {
  722.             cin >> add_string;
  723.             if (f) {
  724.                 System* d = root->find_obj(add_string);
  725.                 if (d)delete_connect_by_class_id(f, d, f->get_class_id());
  726.                 else cout << "\nHandler object " << add_string << " not found";
  727.             }
  728.             else cout << "\nObject " << obj_path << " not found";
  729.         }
  730.         else if (system_command == "SET_CONDITION")
  731.         {
  732.             cin >> add_string;
  733.             if (f)f->set_state(stoi(add_string));
  734.             else cout << "\nObject " << obj_path << " not found";
  735.         }
  736.         cin >> system_command;
  737.     }*/
  738. }
  739. int App::exec_app() {//Реализация exec_app
  740.     cout << "Object tree";
  741.     root->print_tree();//Печать дерева
  742.     //root->set_tree_as_ready();
  743.     //call_signal_handler_system();
  744.     ////cout<<"\nThe tree of objects and their readiness";
  745.     ////root->print_status_tree();
  746.     return 0;
  747. }
  748.  
  749. int main()
  750. {
  751.     App ob_cl_application(nullptr);//Объявление объекта класса App c начальными параметрами
  752.     ob_cl_application.build_tree_objs();//Построения дерева с помощью метода build_tree_objs
  753.     return ob_cl_application.exec_app();//Запуск приложения по построению дерева
  754. }
  755.  
Advertisement
RAW Paste Data Copied
Advertisement