7

実行時に項目を QList に追加しようとしていますが、エラー メッセージが表示されます。基本的に私がやろうとしているのは、QLists の QList を作成し、いくつかの customClass オブジェクトを各内部リストに追加することです。これが私のコードです:

ウィジェット.h:

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    static QList<QList<customClass> > testlist(){
        QList<QList<customClass> > mylist;
        for(int w=0 ; w<5 ; w++){
            mylist.append(QList<customClass>());
        }
        for(int z=0 ; z<mylist.size() ; z++){
            for(int x=0 ; x<10 ; x++){
                customClass co = customClass();
                mylist.at(z).append(co);
            }
        }
        return mylist;
    }
};

customclass.h:

class customClass
{
public:
    customClass(){
        this->varInt = 1;
        this->varQString = "hello world";
    }
    int varInt;
    QString varQString;
};

main.cpp:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    QList<QList<customClass> > list;
    list = w.testlist();
    w.show();
    return a.exec();
}

しかし、アプリケーションをコンパイルしようとすると、次のエラーが発生します。

error: passing `const QList<customClass>' as `this' argument of `void List<T>::append(const T&) [with T = customClass]' discards qualifiers

また、foreach を使用してオブジェクトを挿入しようとしました。

foreach(QList<customClass> list, mylist){
    for(int x=0 ; x<10 ; x++){
        list.append(customClass());
    }
}

エラーはなくなりましたが、customClass オブジェクトは追加されませんでした。メインのデバッグ ループを使用して、内側の QList のサイズがゼロであることを確認できました。私は何を間違っていますか?

4

4 に答える 4

9

Qtリファレンスは次のように述べています。

const T & at ( int i ) const

だがしかし:

T& at ( int i )

そのため、の非 const バージョンはありませんatoperator[]代わりに使用する必要があります。

したがって、次のように変更します。

mylist[z].append(co);

そしてそれはうまくいくでしょう。私もそれをテストしました。

in は参照ではないため、 foreach バージョンは機能しないと思いforeach(QList<customClass> list, mylist) QList<customClass> listます。しかしforeach(QList<customClass>& list, mylist)、コンパイルされません。そのため、通常for(...)版を使用する必要があります。

于 2010-03-22T15:23:43.890 に答える
3

エラーは次の行で報告する必要があります。

    for(int z=0 ; z<mylist.size() ; z++){
        for(int x=0 ; x<10 ; x++){
            customClass co = customClass();
            mylist.at(z).append(co);           // Error is here
        }
    }

QList::at(int);インデックスiのオブジェクトへのconst参照を返します。

QList::operator[](int i);非定数参照を返すものを使用する必要があります。

于 2010-03-22T15:27:54.023 に答える
3

foreach( T i, container ) はコピーを作成します。それを変更すると、オリジナルではなくコピーが変更されます。したがって、代わりに常に foreach( const T& i, container) を使用する必要があります。

于 2010-03-22T21:06:38.630 に答える
0

または、const メンバー関数から値を取得する別の方法がある可能性があります const 関数を呼び出した後に関数を呼び出す代わりに、値にアクセスするために属性値を直接使用します。その属性については、公開アクセス下にある必要があります。

例えば。

class ABC
{
    public:
          int a;

}

list.at(i).a; list.at(i).getValue(); の代わりに

于 2013-01-31T10:48:37.823 に答える