Qt序列化,非成员QDataStream&运营商LT;<

时间:2012-02-26 14:39:22

标签: c++ qt serialization

我有一个类IDocument,它作为某些类的接口。它有一些摘要方法(virtual ... = 0)。

我想这样做所有子类也必须实现序列化的运算符:

  

除了此处记录的重载流运算符之外,您可能要序列化到QDataStream的任何Qt类都将具有声明为该类非成员的适当流运算符:

我甚至不确定如何制作抽象运算符,但如何将其定义为非成员呢?

1 个答案:

答案 0 :(得分:2)

非成员运算符是一个自由函数,与其他任何自由函数非常相似。对于QDataStreamoperator<<上的内容如下:

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;
}