-5
template <class T>
Stack<T>::Stack(const Stack<T>& otherStack)
{
        List<T> the=otherStack.list;
        ListItem<T> *temp=the.getHead();
        while(temp!=NULL)
        {
                push(temp->value);
                temp=temp->next;
        }
}

リンク リストを使用してスタックを作成していますが、コピー コンストラクターが機能していません。誰か助けてください。

のコピー コンストラクターList<T>は次のように定義されます。

template <class T>
List<T>::List(const List<T>& otherList)
{
    head=NULL;
    ListItem<T> *temp=otherList.head;

    while (temp!=NULL)
    {
        insertAtTail(temp->value);
        temp=temp->next;
    }
}
4

3 に答える 3

1

Listとが通常のセマンティクスを持っている場合Stack、コンストラクターは構築されたオブジェクト内のアイテムの順序を逆にします。したがって、逆の順序でリストをトラバースするか、そのようなコピーを 2 回実行して元の順序を復元する必要があります。List代入演算子 と

this.list = otherStack.list

で十分です。しかし、List私にはわからないコードが表示されません。

于 2013-02-12T14:05:28.643 に答える
0

が(十分であるため)listの唯一のメンバーであり、すでに正しいコピーコンストラクターが実装されていると仮定すると、現在、最初の割り当てでリストをコピーしています。StackList

template <class T>
Stack<T>::Stack(const Stack<T>& otherStack)
{
        List<T> the=otherStack.list;        // <-- list is copied
        ListItem<T> *temp=the.getHead();
        while(temp!=NULL)
        {
                push(temp->value);
                temp=temp->next;
        }
}

リスト全体のコピーを取得した後、そのコピーの要素をスタックにプッシュします。ただし、リストをメンバーにコピーするだけでlist(または、より適切に言えlistば、のリストで初期化するotherStackだけで)、スタック全体をコピーするのに十分です。

template <class T>
Stack<T>::Stack(const Stack<T>& otherStack) :
    list (otherStack.list)  // <--- list is copied
{
}

これは、問題をのコピー構築に「移動」するだけかもしれませんList

于 2013-02-12T13:37:30.490 に答える
-1

コードフラグメントは、問題を特定するのに十分ではありません。例:行:

List<T> the=otherStack.list;

リストのコピーを作成します。リンクリストの実装がカスタムの場合、そのコピーコンストラクターに問題がある可能性があります。試す

List<T> &the=otherStack.list;
于 2013-02-12T13:37:30.567 に答える