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 这让我在同一条船上 由于我在 return 语句中获得了良好的数据,我想知道序列化指针的 QLists 是否存在问题。嗯 您仍然可以将指针添加到您的 QList,请查看 this 示例。我知道它是用矢量,但想法是一样的。

以上是关于QList<Class*> 的 QDatastream 运算符>>的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将对象/指针存储到 Qlist 中

将 QList<std::string> 转换为 QList<QString>

用于 QList 的 QSetting<数据类型>

QList<int> 不能用作Repeater 的模型

QList

指向 QList 中元素的指针