Оператор QDataStream >> на std :: map, как инициализировать без конструктора по умолчанию? - PullRequest
1 голос
/ 09 июня 2019

первый пост на Stackoverflow!

Итак, подведем итог моей проблемы:

Я пытаюсь сериализовать пользовательский класс, который содержит карту другого пользовательского класса (std :: map).

Так что для сериализации у меня есть:

QDataStream& operator<<(QDataStream& out, const std::map<QString, MyCLass>& i){
    out << static_cast<quint32>(i.size());
    for (auto& elem : i)
    {
        out << elem.first;
        out << elem.second;
    }
    return out;
}

А для десериализации у меня есть:

QDataStream& operator>>(QDataStream& in, std::map<QString, MyClass>& i){
    quint32 mapSize;
    in >> mapSize;
    i.clear();

    MyClass im; //Problem here, I do not have a default constructor
    QString key;

    while(mapSize--){
        in >> key;
        in >> im;
        i.insert(std::pair<QString, MyClass>(key, im));
    }
    return in;
}

Итак, проблема в том, что у меня нет (и я не очень хочу) конструктора по умолчанию для MyClass. Конечно, я не могу просто заявить, что я такой, и это приводит меня к моему вопросу: Как бы вы пошли о сериализации / десериализации этого пользовательского класса?

Я пытался использовать malloc и указатель:

    MyClass* im = (MyClass*) malloc(sizeof(MyClass));

Но проблема остается при вставке объекта MyClass в карту:

i.insert(std::pair<QString, MyClass>(key, *im));

выдает ошибку: surchargesqdatastream.cpp: 84: 18: ошибка: отсутствует соответствующий конструктор для инициализации 'std :: pair'

...