主要测试运算符重载
代码如下:
//person.h
#ifndef PERSON_H
#define PERSON_H
#include <QString>
class Person
{
public:
Person();
Person(const QString &firstName, const QString &initials, const QString &familyName);
const QString &firstName() const;
const QString &initials() const;
const QString &familyName() const;
void setFirstName(const QString &firstName);
void setInitials(const QString &initials);
void setFamilyName(const QString &familyName);
private:
QString m_firstName;
QString m_initials;
QString m_familyName;
};
#endif // PERSON_H
//person.cpp
#include "person.h"
Person::Person()
{
}
Person::Person(const QString &firstName, const QString &initials, const QString &familyName) :
m_firstName(firstName), m_initials(initials), m_familyName(familyName)
{
}
const QString &Person::firstName() const
{
return m_firstName;
}
const QString &Person::initials() const
{
return m_initials;
}
const QString &Person::familyName() const
{
return m_familyName;
}
void Person::setFirstName(const QString &firstName)
{
m_firstName = firstName;
}
void Person::setInitials(const QString &initials)
{
m_initials = initials;
}
void Person::setFamilyName(const QString &familyName)
{
m_familyName = familyName;
}
//main.cpp
#include <QApplication>
#include <QList>
#include <QFile>
#include <QDataStream>
#include <QHash>
#include <QVariant>
#include "person.h"
// Insert code for exercise step 3 here
QDataStream &operator<<(QDataStream &stream, const Person &per)
{
stream<<per.firstName()
<<per.initials()
<<per.familyName();
return stream;
// stream << t.string();
// stream << t.integer();
// stream << t.double();
}
QDataStream &operator>>(QDataStream &stream, Person &per)
{
QString firstname,initials,family;
stream>>firstname>>initials>>family;
per.setFirstName(firstname);
per.setInitials(initials);
per.setFamilyName(family);
return stream;
// QString t;
// stream >> t; t.setString(t);
}
// Insert code for exercise step 4 here
Q_DECLARE_METATYPE(Person)
uint qHash(const Person& pe)
{
return qHash(pe.firstName());//return qHash(pe.initials());
}
bool operator==(const Person &p1, const Person &p2)
{
if(p1.firstName()==p2.firstName() &&
p1.initials()==p2.initials() &&
p1.familyName()==p2.familyName())
return true;
else
return false;
}
// Insert code for exercise step 5 here
// Do not modify code below this line (except activating code for exercise steps 4 and 5)
void savePeople(const QList<Person> &people)
{
QFile file("persons.dat");
if(!file.open(QIODevice::WriteOnly))
return;
QDataStream stream(&file);
stream << people;
file.close();
}
QList<Person> loadPeople()
{
QList<Person> result;
QFile file("persons.dat");
if(!file.open(QIODevice::ReadOnly))
return result;
QDataStream stream(&file);
stream >> result;
return result;
}
void saveAndLoadPeople(QList<Person> people)
{
qDebug("Original people");
foreach(const Person &p, people)
qDebug(" %s %s %s", qPrintable(p.firstName()), qPrintable(p.initials()), qPrintable(p.familyName()));
savePeople(people);
people = loadPeople();
qDebug("Loaded people");
foreach(const Person &p, people)
qDebug(" %s %s %s", qPrintable(p.firstName()), qPrintable(p.initials()), qPrintable(p.familyName()));
}
void hashOfPeople()
{
QHash<Person, int> age;
age[Person("John", "", "Doe")] = 42;
age[Person("Jane", "", "Doe")] = 36;
age[Person("Albert", "A", "Einstein")] = 76;
if(42 != age[Person("John", "", "Doe")])
qDebug("Something's wrong with John");
if(36 != age[Person("Jane", "", "Doe")])
qDebug("Something's wrong with Jane");
if(76 != age[Person("Albert", "A", "Einstein")])
qDebug("Something's wrong with Albert");
}
void variantsOfPeople(QList<Person> people)
{
qDebug("Original variants of people");
foreach(const Person &p, people)
qDebug(" %s %s %s", qPrintable(p.firstName()), qPrintable(p.initials()), qPrintable(p.familyName()));
QList<QVariant> variantList;
foreach(const Person &p, people)
variantList << QVariant::fromValue(p);
people.clear();
foreach(const QVariant &v, variantList)
people << v.value<Person>();
qDebug("People after variants");
foreach(const Person &p, people)
qDebug(" %s %s %s", qPrintable(p.firstName()), qPrintable(p.initials()), qPrintable(p.familyName()));
}
int main(int argc, char **argv)
{
QApplication a(argc, argv);
Person johnD("John","","Doe");
Person janeD("Jane","","Doe");
QList<Person> people;
people << johnD << janeD << Person("Albert", "A", "Einstein");
saveAndLoadPeople(people);
hashOfPeople();
variantsOfPeople(people);
return a.exec();
}
程序运行截图: