Очень давно я хотел разобраться как переопределять оператор << для своего класса.
На самом деле все работает, но как всегда есть нюансы. Почему-то у нас сработало только через объявление оператора << через 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!))
Прям то, что нужно получается.