QList<Class*> 的 QDatastream 运算符>>
Posted
技术标签:
【中文标题】QList<Class*> 的 QDatastream 运算符>>【英文标题】:QDatastream operator>> for QList<Class*> 【发布时间】:2011-09-11 22:55:34 【问题描述】:所以我为自定义类重载了 QDatastream 的 >> 和 .
这是一些示例代码。
QDataStream & operator <<(QDataStream &dataStream, const Faction &rhs)
return rhs.write(dataStream);
QDataStream & operator >>(QDataStream &dataStream, Faction &rhs)
return rhs.read(dataStream);
QDataStream & operator <<(QDataStream &dataStream, const Faction *rhs)
return rhs->write(dataStream);
QDataStream & operator >>(QDataStream &dataStream, Faction *rhs)
rhs = new Faction();
return rhs->read(dataStream);
QDataStream & Faction::read(QDataStream &dataStream)
QString tag;
dataStream >> tag;
QString classTag = QString(typeid(this).name());
getTypeName(&classTag);
if (tag == classTag + "Start")
while (tag != classTag + "End")
if (tag == "name")
dataStream >> name; // The name of the faction.
else if (tag == "buildings")
dataStream >> buildings; // The buildings of the Faction.
else if (tag == "units")
dataStream >> units; // The units of the Faction.
else if (tag == "upgrades")
dataStream >> upgrades; // The upgrades of the Faction.
else if (tag == "startBuildings")
dataStream >> startBuildings; // The list of buildings when starting a game.
else if (tag == "startUnits")
dataStream >> startUnits; // The list of units when starting a game.
else if (tag == "startUpgrades")
dataStream >> startUpgrades; // The list of upgrades when starting a game.
// Reading the next tag.
dataStream >> tag;
return dataStream;
QDataStream & Faction::write(QDataStream &dataStream) const
QString classTag = QString(typeid(this).name());
getTypeName(&classTag);
dataStream << QString(classTag + "Start");
dataStream << QString("name");
dataStream << name; // The name of the faction.
dataStream << QString("buildings");
dataStream << buildings; // The buildings of the Faction.
dataStream << QString("units");
dataStream << units; // The units of the Faction.
dataStream << QString("upgrades");
dataStream << upgrades; // The upgrades of the Faction.
dataStream << QString("startBuildings");
dataStream << startBuildings; // The list of buildings when starting a game.
dataStream << QString("startUnits");
dataStream << startUnits; // The list of units when starting a game.
dataStream << QString("startUpgrades");
dataStream << startUpgrades; // The list of upgrades when starting a game.
dataStream << QString(classTag + "End");
return dataStream;
Faction.h
#ifndef FACTION_H
#define FACTION_H
#include <JECUtils.h>
#include <Unit.h>
#include <UnitBase.h>
class Faction
public:
explicit Faction();
explicit Faction(const QString& name);
Faction(const Faction& faction);
Faction& operator=(const Faction& rhs);
bool operator==(const Faction& rhs) const;
bool operator!=(const Faction& rhs) const;
friend QDataStream &operator<<(QDataStream &dataStream, const Faction& rhs);
friend QDataStream &operator>>(QDataStream &dataStream, Faction& rhs);
friend QDataStream &operator<<(QDataStream &dataStream, const Faction* rhs);
friend QDataStream &operator>>(QDataStream &dataStream, Faction* rhs);
void addBuilding(UnitBase* building);
void addUnit(UnitBase* unit);
void addUpgrade(UnitBase* upgrade);
const QString& getName() const;
const UnitBase* getBuilding(const int& index) const;
const QList<UnitBase*>& getBuildings() const;
const UnitBase* getUnit(const int& index) const;
const QList<UnitBase*>& getUnits() const;
const UnitBase* getUpgrade(const int& index) const;
const QList<UnitBase*>& getUpgrades() const;
const QList<QList<Unit*> >* getStartUnits() const;
const QList<QList<Unit*> >* getStartBuildings() const;
const QList<QList<Unit*> >* getStartUpgrades() const;
void initialize(const QStringList& globalActions);
void removeAllBuilding();
void removeAllUnit();
void removeAllUpgrade();
void removeBuilding(const int& index);
void removeUnit(const int& index);
void removeUpgrade(const int& index);
void setStartUp(const QStringList& names, const QList<int>& quantities);
protected:
QDataStream& read(QDataStream &dataStream);
QDataStream& write(QDataStream &dataStream) const;
private:
QString name; // The name of the faction.
QList<UnitBase*> buildings; // The buildings of the Faction.
QList<UnitBase*> units; // The units of the Faction.
QList<UnitBase*> upgrades; // The upgrades of the Faction.
QList<QList<Unit*> > startBuildings; // The list of buildings when starting a game.
QList<QList<Unit*> > startUnits; // The list of units when starting a game.
QList<QList<Unit*> > startUpgrades; // The list of upgrades when starting a game.
;
#endif // FACTION_H
所以在这个特定的例子中,我有一个 QList。当代码
dataStream >> factions
运行,Faction* 的整个 QList 应该被读入。但是我得到了垃圾。
QDataStream & operator >>(QDataStream &dataStream, Faction *rhs)
rhs = new Faction();
return rhs->read(dataStream); <---- rhs will return good data.
rhs 包含从文件中读取的正确数据。但是,在读取整个 QList 之后,QList 中会出现垃圾值。
谁能帮帮我?
【问题讨论】:
【参考方案1】:运算符 >> 期望引用作为其第二个参数,您也可以引用指针:
QDataStream & operator >>(QDataStream &dataStream, Faction *&rhs)
rhs = new Faction();
return rhs->read(dataStream);
【讨论】:
这就是问题所在。所以我想确保我理解你改变了什么。因此,我们没有传递指针的“副本”,而是传递了对指针的引用,因此对该指针所做的任何更改都将针对原始指针进行。听起来对吗?【参考方案2】:因为你想改变 rhs 指向的东西,你应该将一个指向指针的指针作为参数传递给你的操作符。
此外,这样做,指针的更改将在函数返回时反映出来。
QDataStream & operator >>(QDataStream &dataStream, Faction **rhs)
*rhs = new Faction();
return (*rhs)->read(dataStream); <---- rhs will return good data.
【讨论】:
我试过了,它不会编译,因为我的 var 是 QList以上是关于QList<Class*> 的 QDatastream 运算符>>的主要内容,如果未能解决你的问题,请参考以下文章