2012-02-16 6 views
0

ImはQTでモデルを作成し、このコードに出くわした:qListリファレンスを持つコンストラクタはどのように動作しますか?

class StringListModel : public QAbstractListModel 
{ 
    Q_OBJECT 

public: 
    StringListModel(const QStringList &strings, QObject *parent = 0) 
    : QAbstractListModel(parent), stringList(strings) {} 

    int rowCount(const QModelIndex &parent = QModelIndex()) const; 
    QVariant data(const QModelIndex &index, int role) const; 
    QVariant headerData(int section, Qt::Orientation orientation, 
        int role = Qt::DisplayRole) const; 

private: 
    QStringList stringList; 
}; 

今、私は疑問に思うが、この仕事をしますか?この関数にqstringlistを渡してスタックのlocaletedを実行し、スコープを使い果たした場合、このオブジェクトは文字列リストを失うことはありませんか?

読む両方: C++ reference in constructor と:一部の人々は、それが無効になることを言うが、いくつかは、(その例で)文字列をローカル変数にコピーされますことを言うConstructors accepting string reference. Bad idea?

..これは本当に混乱しています。

答えて

2

あなたが尋ねていることを理解していれば、QStringList &stringsが参照渡されているので気になりますか?

初期化リストは、stringList(const &QStringList)コピーコンストラクタを呼び出します。このコピーコンストラクタは、渡された&QStringListオブジェクトの状態を新しいオブジェクトにコピーし、そのオブジェクトをstringListに割り当てます。は元の&stringsが有効範囲外になるか、それ以外の場合は破棄されます。stringListは別のオブジェクトを指しています。

2番目のリンクでは、コピーコンストラクタは呼び出されません。メンバーオブジェクトは、渡された同じオブジェクトをポイントするように割り当てられます。渡されたオブジェクトがプログラムの後半で破棄された場合、メンバオブジェクトはその破棄されたオブジェクトをまだ指しているため無効になります。

+0

何を待っていますか? QAbstractListModel(親)、stringList(文字列){} :QAbstractListModel(親)、StringListModel(文字列) それを説明できますか? – chikuba

+1

私は彼が最初のことではなく、 "あなたの第2のリンク"と言っていたと思います。 *あなたのメンバー変数に*コピーされた*参照を使用するだけでなく、指定されたQStringListへの参照を**保存していれば、あなたのサンプルに問題があります。 – Chris

+0

@Chrisいいキャッチ。私は第二のリンクを意味した。 –

関連する問題