Разместите свой проект бесплатно и начните получать предложения от фрилансеров-исполнителей уже спустя минуты после публикации!
300 ₴

C++ верификация сериализации класса.

истекло время актуальности


Необходимо реализовать Comparison and Copy assignment operator класса.

Так же необходимо написать юнит тест на сериализацию класса используя реализацию указанных операторов.







Обновление #1 от 29 сентября 2019
Юнит тест должен быть следующего вида:

{
BaseClass* mock_inst;// наследник от BaseClass который инициализирует мемберы тестовыми данными
BaseClass* test_inst;

test_inst = mock_inst;

//TODO serialization test_inst
//TODO deserialization de_test_inst

EXPECT_TRUE(de_test_inst == mock_inst);
}

Задание не предусматривает реализацию сериализации/десериализации класса. Это уже есть в проекте и это можно использовать в юниттесте.
Воркфлоу испонителя следующий: качаете исходники солюшена(нужна учетка MSDN) (я сопровождаю этот процесс), решаете поставленную задачу, отправляете на кодревью (я сопровождаю этот процесс) и после его успешного прохождения сабмитете в кодовую базу и получаете оплату.
Все сопутствующие вопросы решаются по skype.

Приложения 1

Просмотр приложений доступен только зарегистрированным пользователям.

  1.  1 день 300 ₴
    Дмитрий
    Дмитрий Кузнецов
    53     3  2

    Могу сделать. Есть опыт написания программ на С++. Связь Телеграм dimaprogr.

    Украина Одесса | 27 сентября 2019 |
  2.  фрилансер больше не работает на сервисе
  • Anton Kravtsov
    26 сентября 2019 |

    Необходимо реализовать Comparison and Copy assignment operator класса 

    Какой класс имеется в виду?

    Вот такая реализация:

    class T {
    ...
    bool operator == (const T& other) const
     { return memcmp(this, &other, sizeof(*this)) = 0; }
    T(const T& other) { memcpy(this, &other, sizeof(*this)); }
    ...
    }

    Подойдёт? 🙂)

    PS: ни один компилятор при написании данного кода не пострадал 🙂

  • Alex Karp — заказчик проекта
    27 сентября 2019 |

    В вашем коде я увидел оператор сравнения и копи конструктор. Так что этот код не подойдет).

  • Сергей Назаренко
    28 сентября 2019 |

    Скажите, а Вам нужно сравнивать и присваивать какой-то конкретный класс? Или нужно универсальное решение?

  • Alex Karp — заказчик проекта
    28 сентября 2019 |

    Это нужно для конкретного класса с мемберами.

  • Сергей Назаренко
    28 сентября 2019 |

    Так может Вы определение класса приложите (из h-файла)?

    А то ща подпишемся за 300 грн на Вашу задачу, а там окажется сто-пятсот мемберов, которые сами являются классами, внутри которых хранятся классы, и все это с перекрестными ссылками... и там работы на 10 лет.

  • Alex Karp — заказчик проекта
    28 сентября 2019 |

    Можете так же ответить на следующие вопросы: есть ли опыт компиляции под Linux, опыт написания UI (wxWidgets ), написания клиент-серверных приложений и готовы ли к оплате труда после того как решение пройдет кодревью? Задачек много и разных.

  • Сергей Назаренко
    28 сентября 2019 |

    Опыт компиляции под Linux есть, но ему уже около 20 лет и я уже и не вспомню как этот Linux установить, не то, что там что-то компилировать 😔
    wXWidgets - даже не слышал о таком.
    Опыт написания клиент-серверных приложений есть небольшой, но тоже давненько это было.
    Так что пойду я, наверное, мимо этой задачи.


    Оплата после код-ревью - вполне нормально, если заказчику доверяешь. Не знаю почему, но к Вам у меня пока доверия нет.


    А вообще, все эти нюансы нужно было с самого начала в тексте задачи указать.
    Сэкономили бы много времени себе и людям.
    Всего доброго.

  • Anton Kravtsov
    28 сентября 2019 |

    Задачек много и разных 

    Отлично! Ради этого мы все здесь и собрались 🙂

    Задачи целесообразно формировать отдельными проектами, где чётко прописывать все особенности выполнения: и исполнителям проще будет понять, что требуется/ожидается, и вам, как заказчику, по откликам будет понятно, кто вам подходит.

    Так что ждём-с 🙂

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Добавил архив с описанием класса.

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Уточняю, текущая задача требует только базовых знаний C++. Дополнительные вопросы, которые я задал помогут мне только в выборе исполнителя(ей) для возможного долгосрочного сотруднечиства.

  • Anton Kravtsov
    29 сентября 2019 |

    Было бы отлично ещё уточнить постановку задачи, потому что необходимость в copy assignment operator выглядит неочевидной в контексте тестирования сериализации.

    А comparison operator имеет смысл делать в такой манере:

    void operator == (const T& other) {
      std::stringstream ss1;
      boost::archive::text_oarchive oa1{ss1}; 
      oa1 << *this;
      std::stringstream ss2;
      boost::archive::text_oarchive oa2{ss2}; 
      oa2 << other;
      return ss1 == ss2;
    }

    Это, конечно, то ещё курощение, но позволит избавиться от copy'n'paste. И если это только для тестов, то ... пойдёт 🙂

    Вообще это всё можно засунуть поглубже в ... unit-test, чтоб кто-то случайно не начал использовать в production 🙂

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Обновил описание задачки.

  • Anton Kravtsov
    29 сентября 2019 |
    BaseClass* mock_inst;// наследник от BaseClass который инициализирует мемберы тестовыми данными
    BaseClass* test_inst;
    
    test_inst = mock_inst; 

    Наверное, последнее присваивание должно быть в таком виде:

    *test_inst = *mock_inst; 

    Но и после этого непонятно, зачем оно в unit-test'е 🙂

    В контексте вашего толстого класса SlotBase оператор присваивания как и оператор копирования имеет смысл вообще запретить (потому что у вас там намечается толпа потомков), и если нужна копия объекта (но опять же вопрос - зачем?), то думать в направлении "клонирования":

    SloteBase* clone() const;

    PS: не сразу заметил, что у вас все data members сделаны protected - it's just a bad idea 🙂

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    В описании задачи нет запроса на поиск решения. Прошу, прекратить предлагать не работающий код.

  • Сергей Назаренко
    29 сентября 2019 |

    Я так понимаю, что Алекс как раз и хочет, чтобы ему сделали оператор присваивания, который будет грамотно весь айсберг всю иерархию аккуратно рекурсивно копировать, заменяя ссылки на данные ссылками на копии этих данных.
    Ну и оператор сравнения ему аналогичный нужен. Чтобы он не ссылки сравнивал, а данные в этих ссылках. Причем, рекурсивно по всей иерархии вложенных объектов.

    И все это за 300 грн!

    Алекс. У Вас есть шанс найти исполнителя, который Вам сделает эту задачу, если Вы в бюджет пару нулей справа допишете.

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Там нет не ссылок не рекурсии, вы почему то любите все усложнять и драматизировать. Сергей, эта задача не для вас.

  • Сергей Назаренко
    29 сентября 2019 |

    То, что я не умею пользоваться компилятором под Линукс еще не говорит, что я ничего не понимаю в С++.


    Если там нет ссылок и вложенных объектов, то чем Вам memcpy не подходит?


    И я хоть и не Сеньйор С++, но имеющихся у меня знаний достаточно, чтобы понимать, что вот это все

            std::vector<array_2d_t> m_view_symbols{};

            std::vector<int> m_wild_sticky{};

            array_2d_t m_view_symbols_prev{};

            std::vector<unsigned> m_stop_numbers_from_file;

            std::function<int(SlotBase&, unsigned)> m_get_stop_number_func;

            std::vector<std::vector<std::string>> m_symbols_names;

            std::vector<array_2d_t> m_paytable{};

            array_2d_t m_lines_combinations;

            array_1d_t<int> m_reels_stops;

            array_1d_t<int> m_free_game_scatter_multiplier_table;

            array_1d_t<int> m_scatter_multiplier_table;

            array_1d_t<int> m_wild_multiplier_table;

            array_1d_t<int> m_bonus_multiplier_table;

            array_1d_t<int> m_free_game_table;

            array_1d_t<int> m_bonus_game_table;

            array_1d_t<bool> m_bonus_on_any_pay_line;

            std::string    m_game_id;

            std::vector<array_2d_t> m_reels_collection{};

            std::string m_file_name;

            std::vector<int> m_scatter_number{};

            std::vector<int> m_wild_number{};

            std::vector<int> m_bonus_number{};

            std::vector<int> m_free_games_multiplier_table{}; 

            std::unordered_map<std::string, std::string> m_bonus_game_result;

            std::vector<array_1d_t<int>> m_wild_for_table;

            mutable std::vector<std::vector<std::vector<double>>> m_symbol_money;

            mutable std::vector<array_2d_t> m_game_symbols_hit_rate;

            mutable std::vector<double> m_games_money{ 0.0 }; 

            mutable std::vector<double> m_games_max_win{ 0.0 };

            mutable std::vector<long long> m_games_hit_rate{ 0 };

            mutable std::vector<long long> m_total_num_of_games{ 0 };

    является вложенными объектами и коллекциями, которые придется копировать достаточно аккуратно, чтобы быть уверенным в том, что копия нашего объекта хранит копии (а не оригиналы) вложенных объектов и коллекций.

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Предположу, что смущает array_2d_t, array_1d_t. Так что добавлю следующее описание:


    using array_2d_t = std::vector<std::vector<int>>;

    template<typename dataT>
    using array_1d_t = typename std::vector<dataT>;


    Но опять таки, Сергей эта задача не для вас. Не тратьте свое и мое время.

  • Сергей Назаренко
    29 сентября 2019 |

    Судя по бюджету задачи, там работы менее, чем на 1 час.
    Судя по Вашим комментариям - Вы лучше нас разбираетесь в задаче.
    Вы уже значительно больше времени потратили на создание этой задачи и ее обсуждение.
    Почему бы Вам самому ее не сделать?

  • Alex Karp — заказчик проекта
    29 сентября 2019 |

    Абсолютно верно, работы на 1-2 часа. И я действительно потратил больше времени на обсуждение, но как я уже говорил простых задачек много и нужно найти человека, который потихоньку бы их делал, а я в это время смог решать другие задачи. Так, что надеюсь найти компетентного исполнителя и готов на это потратить столько времени сколько понадобится.

  • Anton Kravtsov
    29 сентября 2019 |

    в этом списке единственный data member, возможно, потребует особого обращения:

    std::function<int(SlotBase&, unsigned)> m_get_stop_number_func; 

    Всё остальное можно сделать типичным присваиванием и сравнением.

    Подобная задачка сводится по сути к "набору текста", что заказчик мог бы и указать в формулировке - это сэкономило массу времени всем незаинтересованным сторонам 🙂