Guest User

Untitled

a guest
Jan 10th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. class Field {
  6. private:
  7.     std::string fieldName;
  8.     std::string fieldValue;
  9. public:
  10.     Field(std::string fieldName) : fieldName(std::move(fieldName)) {}
  11.  
  12.     Field& operator =(std::string newValue) {
  13.         fieldValue = std::move(newValue);
  14.         return *this;
  15.     }
  16.  
  17.     std::string& operator()() {
  18.         return fieldValue;
  19.     }
  20. private:
  21.  
  22.     std::string& get_name() {
  23.         return fieldName;
  24.     }
  25.  
  26.     friend class Writer;
  27.     friend class Object;
  28. };
  29.  
  30. class Object {
  31. private:
  32.     friend class Writer;
  33.     std::vector<Field *> fields_;
  34.  
  35.     std::vector<Field *>& getFields() {
  36.         return fields_;
  37.     }
  38. public:
  39.     Object() = default;
  40.  
  41. protected:
  42.     void registerField(Field *field) {
  43.         fields_.push_back(field);
  44.     }
  45. };
  46.  
  47.  
  48. class Writer {
  49. public:
  50.  
  51.     void write(std::vector<Object *> objects) {
  52.         if (objects.empty()) return ;
  53.         const auto& fields = objects.front()->fields_;
  54.         for (int i = 0; i < fields.size(); i ++) {
  55.             std::cout << fields[i]->get_name();
  56.             if (i + 1 != fields.size()) std::cout << ",";
  57.         }
  58.         std::cout << "\n";
  59.         for (auto obj : objects) {
  60.             for (int i = 0; i < fields.size(); i ++) {
  61.                 std::cout << (*obj->fields_[i])();
  62.                 if (i + 1 != fields.size()) std::cout << ",";
  63.             }
  64.             std::cout << "\n";
  65.         }
  66.     }
  67. };
  68.  
  69.  
  70. class Agency : public Object {
  71. public:
  72.     Field agencyId;
  73.     Field agencyName;
  74.     Field agencyUrl;
  75.  
  76.     Agency()
  77.         : agencyId("agency_id")
  78.         , agencyName("agency_name")
  79.         , agencyUrl("agency_url")
  80.     {
  81.         registerField(&agencyId);
  82.         registerField(&agencyName);
  83.         registerField(&agencyUrl);
  84.     }
  85. };
  86.  
  87. class Stop : public Object {
  88. public:
  89.     Field stopId;
  90.     Field stopName;
  91.  
  92.     Stop()
  93.         : stopId("stop_id")
  94.         , stopName("stop_name")
  95.     {
  96.         registerField(&stopId);
  97.         registerField(&stopName);
  98.     }
  99. };
  100.  
  101. int main() {
  102.     Agency a;
  103.     a.agencyName = "Yandex";
  104.     a.agencyId = "123";
  105.     a.agencyUrl = "http://yandex.ru/";
  106.  
  107.     Stop s;
  108.     s.stopName = "Аптека";
  109.     s.stopId = "2";
  110.     std::vector<Object *> vec;
  111.     vec.push_back(&a);
  112.  
  113.     Writer w;
  114.     w.write(vec);
  115.     vec.clear();
  116.     vec.push_back(&s);
  117.     w.write(vec);
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment