开发者

QDatastream operator>> for QList<Class*>

So i have overloaded the >> and << operators for QDatastream for custom classes. I made 2 versions of each; one for the base object and one for a pointer of the object. So far all versions of the operators work with one exception. The pointer read operator reads the correct data but it is not saved correctly in a QList<*>.

Here's some example code.

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");
    dataSt开发者_Python百科ream << 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

So in this particular example i have a QList. When the code

dataStream >> factions

is ran, the entire QList of Faction* is supposed to be read in. However i get garbage.

QDataStream & operator >>(QDataStream &dataStream, Faction *rhs)
{
    rhs = new Faction();
    return rhs->read(dataStream); <---- rhs will return good data.
}

rhs contains the correct data read in from the file. However, after the entire QList has been read, garbage values are in the QList.

Can anyone help me out?


The operator >> expects a reference as its second parameter, and you can have references to pointers too:

QDataStream & operator >>(QDataStream &dataStream, Faction *&rhs)
{
    rhs = new Faction();
    return rhs->read(dataStream);
}


Because you want to alter what rhs points to, you should pass a pointer to pointer as an argument to your operator.

Also, doing that, the changes to the pointer, will be reflected when the function returns.

QDataStream & operator >>(QDataStream &dataStream, Faction **rhs)
{
    *rhs = new Faction();
    return (*rhs)->read(dataStream); <---- rhs will return good data.
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜