1

getNode():

    Node<type> getNode(int position) {
        Node<type> *item = head;
        for (int i = 0; i < position; ++i) {
            item = item->next;
        }
        return *item;
    };

ノード交換コード:

        Node<Guitar*> temp;
        temp.element = list.getNode(l).element;
        temp.next = list.getNode(l).next;
        list.getNode(l).element = list.getNode(h).element;
        list.getNode(l).next = list.getNode(h).next;
        list.getNode(h).element = temp.element;
        list.getNode(h).next = temp.next;

私はコンピューター サイエンスのクラスのプロジェクトに取り組んでおり、数日後に期限が切れます。かなり単純なクイックソートを使用してリンクされたリストをソートしたいのですが、リスト内のノードを交換するときに奇妙な問題に苦しんでいます。参考までに、getNode() 関数はリスト内の特定のインデックスにあるノードを返し、ノードは次のノード ポインターと共にギター オブジェクトへのポインターを保持します。私は何時間も実験してきましたが、このような行が「list.getNode(h).element = temp.element;」であることがわかりました。リスト内のノードにあるギター オブジェクトへのポインターに、temp オブジェクトのポインターの値が割り当てられていると言っています。これは通常は機能しますが、この時点で左側が変更可能な左辺値ではないというエラーが表示されます。ただし、ポインターを作成して代入演算子の左側に置くことはできましたが、エラーは発生しませんでした。また、逆参照演算子 (*) を前に使用すると、左側にエラーはありませんが、これはノードを正常にスワップしません。私は何かが欠けているに違いない。

4

1 に答える 1

2

関数の戻り値の型は参照型である必要があります。それ以外の場合は、返す値からオブジェクトをコピーして構築し、それを戻り値として使用するようコンパイラに指示します。

ここにある例を書きました。簡単にするために、取得関数に渡すベクトルを構築します。この関数は、コンポーネント オブジェクトの 1 つへの参照解除されたポインターを返します。プログラムの出力を調べると、値への参照を取得するのではなく、値を作成するコピーであることを喜んで通知します。getNode関数から「取得した」ノードに加えた変更は、ノードのコピーに対して行われます。 -必要なノードから構築されます。

一時変数に値を割り当てようとしているため、これが変更不可能な左辺値で問題が発生している理由でもあると思います。


tl ;dr:getNode関数が一時オブジェクトを返しています。代わりに、参照を返すようにします。

于 2015-05-14T01:20:52.483 に答える