Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- class Field {
- private:
- std::string fieldName;
- std::string fieldValue;
- public:
- Field(std::string fieldName) : fieldName(std::move(fieldName)) {}
- Field& operator =(std::string newValue) {
- fieldValue = std::move(newValue);
- return *this;
- }
- std::string& operator()() {
- return fieldValue;
- }
- private:
- std::string& get_name() {
- return fieldName;
- }
- friend class Writer;
- friend class Object;
- };
- class Object {
- private:
- friend class Writer;
- std::vector<Field *> fields_;
- std::vector<Field *>& getFields() {
- return fields_;
- }
- public:
- Object() = default;
- protected:
- void registerField(Field *field) {
- fields_.push_back(field);
- }
- };
- class Writer {
- public:
- void write(std::vector<Object *> objects) {
- if (objects.empty()) return ;
- const auto& fields = objects.front()->fields_;
- for (int i = 0; i < fields.size(); i ++) {
- std::cout << fields[i]->get_name();
- if (i + 1 != fields.size()) std::cout << ",";
- }
- std::cout << "\n";
- for (auto obj : objects) {
- for (int i = 0; i < fields.size(); i ++) {
- std::cout << (*obj->fields_[i])();
- if (i + 1 != fields.size()) std::cout << ",";
- }
- std::cout << "\n";
- }
- }
- };
- class Agency : public Object {
- public:
- Field agencyId;
- Field agencyName;
- Field agencyUrl;
- Agency()
- : agencyId("agency_id")
- , agencyName("agency_name")
- , agencyUrl("agency_url")
- {
- registerField(&agencyId);
- registerField(&agencyName);
- registerField(&agencyUrl);
- }
- };
- class Stop : public Object {
- public:
- Field stopId;
- Field stopName;
- Stop()
- : stopId("stop_id")
- , stopName("stop_name")
- {
- registerField(&stopId);
- registerField(&stopName);
- }
- };
- int main() {
- Agency a;
- a.agencyName = "Yandex";
- a.agencyId = "123";
- a.agencyUrl = "http://yandex.ru/";
- Stop s;
- s.stopName = "Аптека";
- s.stopId = "2";
- std::vector<Object *> vec;
- vec.push_back(&a);
- Writer w;
- w.write(vec);
- vec.clear();
- vec.push_back(&s);
- w.write(vec);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment