operator <<

Очень давно я хотел разобраться как переопределять оператор << для своего класса.

На самом деле все работает, но как всегда есть нюансы. Почему-то у нас сработало только через объявление оператора << через friend. Но не суть вот один из работающих вариантов на Qt 4.8.1.

#ifndef CLASS1_H
#define CLASS1_H

#include <QTextStream>
#include <QDataStream>
#include <QDebug>

struct Class1
{

public:
    Class1();
    int iii;
    void setName(const QString & str);
    QString name;

    friend QDebug operator<< (QDebug d, const Class1 &model);
    friend QDataStream &operator<<(QDataStream &, const Class1 &);

};

.cpp

#include "class1.h"

Class1::Class1():
    iii(456),
    name("cl1 name 123")
{
}

void Class1::setName(const QString & str)
{
    name = str;
}

QDebug operator<<(QDebug d,const Class1 &cl1) {
    d << "Hello world!";
    return d;
}

QDataStream& operator<<(QDataStream &out, const Class1 &cl1)
{
    out << "Class1:\n\tname:" << cl1.name;
    out << "\n\tiii:" << QString::number(cl1.iii);
    return out ;
}

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Class1 cl1;
    qDebug() << cl1;

    QFile file("111222.txt");
    bool bb = file.open(QIODevice::ReadWrite );

    QDataStream stream1;
    stream1.setDevice(&file);
    stream1 << "1111111\n";
    stream1 << &cl1;
    file.close();
}

Тут мы выводим в qDebug() нормально и в файл тоже вполне себе ничего.

Причем если вы Class1 будете использовать в контейнерах (как значение естественно), то вы сможете выводить контейнер также например в qDebug():

#ifndef APPDEF_H
#define APPDEF_H

#include "class1.h"
#include <QHash>
#include "qhashbuilder.h"
#include <QString>
#include <QVariant>
#include <QDebug>

class appDef
{
public:
    appDef();

    static int st1;
    static const int st2;
    static const QHash<int,int> hh;
    static const QHash<int,QVariant> hhv;
    //static const QHash<int,QString> hhs; // ??

    static QHash<int,Class1> mmm1;
    static const QHash<int,const Class1*> mmmCPtr;
    //static const QHash<int,const Class1*const> mmm2cc;
    static const QHash<int,Class1*> mmm2;
    // static const QHash<int,Class1&> mmmR;
    // static const QHash<int,const Class1&> mmmRc; pointer to reference is illegal
    // static const QHash<int,const Class1> mmmC;
    int ii;
};

cpp

#include "appdef.h"

const QHash<int,QVariant> appDef::hhv = QHashBuilder<int,QVariant>()
.add(123,"444444")
.add(234,"3333")
.build();

appDef::appDef():
    ii(1234)
{
}

main.cpp

qDebug() << appDef::mmm1 ;

выведет
QHash((123, Hello world!)(234, Hello world!))

Прям то, что нужно получается.