Сериализация Qt, не член QDataStream & operator < - PullRequest
1 голос
/ 26 февраля 2012

У меня есть класс IDocument, который служит интерфейсом для некоторых классов. Имеет несколько абстрактных методов (virtual ... = 0).

Я хотел бы сделать так, чтобы все подклассы также должны были реализовывать оператор для сериализации:

В дополнение к перегруженным потоковым операторам, описанным здесь, любые классы Qt, которые вы можете захотеть сериализовать в QDataStream, будут иметь соответствующие потоковые операторы, объявленные как не являющиеся членами класса:

Я даже не уверен, как бы я сделал абстрактный оператор, но как я могу определить его без члена?

1 Ответ

2 голосов
/ 26 февраля 2012

Оператор, не являющийся членом, является свободной функцией, почти как любая другая бесплатная функция. Для QDataStream значение operator<< будет выглядеть следующим образом:

QDataStream& operator<<(QDataStream& ds, SomeType const& obj)
{
  // do stuff to write obj to the stream
  return ds;
}

В вашем случае вы могли бы реализовать свою сериализацию следующим образом (это только один из способов сделать это, есть другие):

#include <QtCore>

class Base {
    public:
        Base() {};
        virtual ~Base() {};
    public:
        // This must be overriden by descendants to do
        // the actual serialization I/O
        virtual void serialize(QDataStream&) const = 0;
};

class Derived: public Base {
    QString member;
    public:
        Derived(QString const& str): member(str) {};
    public:
        // Do all the necessary serialization for Derived in here
        void serialize(QDataStream& ds) const {
            ds << member;
        }
};

// This is the non-member operator<< function, valid for Base
// and its derived types, that takes advantage of the virtual
// serialize function.
QDataStream& operator<<(QDataStream& ds, Base const& b)
{
    b.serialize(ds);
    return ds;
}

int main()
{
    Derived d("hello");

    QFile file("file.out");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);

    out << d;
    return 0;
}
...