2011-09-11 94 views
4

因此,我已經爲QDatastream的自定義類重載了>>和< <運算符。我做了每個版本的2個;一個用於基礎對象,另一個用於對象的指針。到目前爲止,所有版本的操作符都有一個例外。指針讀取操作符讀取正確的數據,但它不能正確保存在QList < *>中。QDatastream operator >> for QList <Class*>

下面是一些示例代碼。

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。當代碼

運行,Faction *的整個QList應該被讀入。但是我得到垃圾。

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

rhs包含從文件讀入的正確數據。但是,在讀取完整個QList之後,垃圾值位於QList中。

誰能幫助我嗎?

回答

6

操作>>預計的引用作爲其第二個參數,你可以有引用的指針太:

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

這是問題所在。所以我想確保我明白你改變了什麼。因此,不是傳遞指針的「副本」,而是傳遞指針的引用,以便對該指針所做的任何更改都將轉換爲原始指針。那個聽起來是對的嗎? – jecjackal

+0

是的,就是這樣。 – alexisdm

1

因爲您想要改變rhs指向的內容,您應該將指針指針作爲參數傳遞給您的操作符。

此外,對指針的更改會在函數返回時反映出來。

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

我試過了,它不會編譯,因爲我的變種是的QList 的。我將不得不將其更改爲QList ,這讓我在同一條船上 – jecjackal

+0

由於我在返回語句中獲得了很好的數據,我不知道序列化指針的QLists是否存在問題。 hmm – jecjackal

+0

你可以將你的指針添加到你的QList中,看看[this](http://ideone.com/rMoCS)的例子。我知道它與矢量,但想法是一樣的。 –

相關問題