2011年12月9日金曜日

( Qt C++ )QDataStreamにおいて独自型を使用する。


はい、本日2回目の投稿です。今回はQDataStreamで様々な独自型を使用する場合をメモしていきます。サンプルはGUI Programming with Qt4内のものを使います。そんなに難しいものではなく、<<、>>演算子をオーバーロードするだけです。
では、コードを
(C++ GUI Programming with Qt4 276ページより)

class Painting
{
public:
    Painting() { myYear = 0; }
    Painting(const QString &title, const QString &artist, int year)
    {
        myTitle = title;
        myArtist = artist;
        myYear = year;
    }
    void setTitle(const QString &title) { myTitle = title; }
    QString title() const { return myTitle; }
    ...
private:
    QString myTitle;
    QString myArtist;
    int myYear;
};
//以下重要
QDataStream &operator<<(QDataStream &out, const Painting &painting);
QDataStream &operator>>(QDataStream &in, Painting &painting);

実装は<<は

QDataStream &operator<<(QDataStream &out, const Painting &painting)
{
    out << painting.title() << painting.artist()
        << quint32(painting.year());
    return out;
}

>>は
QDataStream &operator>>(QDataStream &in, Painting &painting)
{
    QString title;
    QString artist;
    quint32 year;
    in >> title >> artist >> year;
    painting = Painting(title, artist, year);//コンストラクタ、実体作成
    return in;
}

です。サンプル通りです。クラスPaintingはまぁよくある普通のクラスです。重要なのは&oreratorの部分です。ここでオーバーロードを宣言しています。実装部は簡単ですね。
引数のinあるいはoutへ、paintingのプライベートメンバの値に入力(実体作成)または値を出力しています。
まさに見ての通りです。
使い方は
out << painting1 << painting2 << painting3;
のようにして使うそうです。
このオーバロードの利点は独自クラスを要素に持つコンテナを扱うときに便利だという点だそうです。例えば
QList<Painting> paintings = ...;
out << paintings;
のように使うそうです。

以上です。次はテキストファイルの1文字づつの読込です。