1

これは二重リンク リスト クラス内の関数ですが、コンパイルするたびに次のメッセージが表示されます。他にどのように行うか。

int& LinkedList::operator[](int index)
{
    Node* current = head_;

    for(int i = 0; i < index; i++){
        current = current->getNextNode();
    }

    return(current->getValue()); // getValue() returns an int
} 

前もって感謝します!

4

4 に答える 4

4

簡単な答え:getValueも返す必要がありint&ます。

于 2012-03-07T00:50:11.727 に答える
2

これを使用してリストに格納されている値を変更できるようにする場合は、その値への参照を返す必要があります。つまりNode::getValue()、参照を返すようにするか、ノードに格納されている値への参照を取得する別の方法を追加する必要があります。

これを使用してリストの内容を変更したくない場合は、戻り値の型を に変更できますint

于 2012-03-07T00:50:03.663 に答える
2

問題は、非 const 参照を右辺値 (この場合、getValue()関数によって返される一時値) にバインドできないことです。呼び出し元が変更できるように、リストに格納されている値への参照を提供する場合は、参照getValue()を返すように変更する必要があります。

一般的な考え方として、リストへのランダム アクセス操作を提供することを検討することをお勧めします。安物と勘違いしているかもしれません。たとえば、ユーザーは次のようにリストを反復しようとする場合があります。

for (int i = 0; i < list.size(); ++i)
    std::cout << list[i] << std::endl;

しかし、その反復は実際には O(N) ではなく O(N^2) です

于 2012-03-07T00:51:20.463 に答える
0

(あなたが知っているように、単に使用する必要があります...これは理由でstd::listこの操作を提供しません...)

あなたが戻ってくる理由int&は、書いた人mylist[i] = 42が実際にリストの内容を変更するためです.

getValueただし、エラー メッセージに基づいてコピーを返すヘルパーを使用して値を取得しています。コンパイラは、データ型を分析して、論理エラーを検出しました。実際のリスト データを変更できるようにする場合は、コピーではなく、実際のリスト データへの参照を返す必要があります。

したがって、フィリップが示唆するように、同様getValueに戻る必要があります。int&

于 2012-03-07T01:50:05.863 に答える