复制构造函数、重载赋值运算符和deepCopy



我正在尝试为Stack的链接列表实现创建一个类模板。现在我得到了推,弹出,偷看,并测试了析构函数。但我想知道我应该如何在代码中添加复制构造函数、重载赋值运算符和deepCopy。到目前为止,我得到的是:

//  Lab3.cpp
//
//  Created by IvanChak on 4/3/16.
//  Copyright © 2016 Space. All rights reserved.
#include <iostream>
using namespace std;
template<class T>
struct Node {
    T item;
    Node* next = NULL;
    Node(T t = {}, Node* link = nullptr) :item{t}, next{link} { }
    ~Node() { delete next; }
};
template<class T>
class Stack {
public:
    bool empty() const { return n == 0; }
    void push(const T&);
    T pop();
    T peek();
    ~Stack();
private:
    Node<T>* top = NULL;
    size_t n;
};
template <class T>
class A
{
public:
    A(const A &){}
    A & operator=(const A& a){return *this;}
};
template<class T>
Stack<T>::~Stack() {
    cout<<"Destructor, deallocate..."<<endl;
}
template<class T>
void Stack<T>::push(const T& t) {
    Node<T>* previous{top};
    top = new Node<T>{t,previous};
    ++n;
}
template<class T>
T Stack<T>::pop() {
    if (empty()) {
        cout << "Empty" << endl;
    }
    Node<T>* oldnode = top;
    T t = top->item;
    top = top->next;
    --n;
    delete oldnode;
    return t;
}
template<class T>
T Stack<T>::peek() {
    if (empty()) {
        cout << "Empty" << endl;
    }
    return top->item;
}
int main(int argc, const char * argv[]) {
    Stack<string> x{};
    x.push("Hello");
    x.push("Second");
    x.push("Bye");
    cout << x.peek() << endl;
    x.pop();
    cout << x.peek() << endl;
}

我不知道你是否还需要答案,但如果你需要,你会想要这样的东西来复制构造函数和赋值运算符:

template<class T>
Stack<T>::Stack(const Stack<T>& rhs)
{
    if (rhs.top)
    {
        this->top = new Node<T>(rhs.top->item);
        Node<T>* rhsNode = rhs.top; // This pointer is used for iterating through the "rhs" argument.
        Node<T>* currentNode = this->top; // This pointer is used for iterating through "this".
        n = 1;
        while (rhsNode->next) // Loop untill the end of the stack has been reached.
        {
            ++n;
            currentNode->next = new Node<T>(rhsNode->next->item);
            currentNode = currentNode->next;
            rhsNode = rhsNode->next;
        }
    }
    else // "rhs" is empty
    {
        n = 0;
        this->top = nullptr;
    }
}

注意:我以"深度复制"的方式编写了这段代码。我想不出在任何情况下对这种类型的数据结构进行"浅层复制"都是好的;事实上,我认为这样做是一个非常糟糕的主意。我不会自动认为你打算让复制构造函数在堆栈上进行"浅复制",但由于你分别命名了复制构造函数和"深度复制",我认为你完全有可能。

我测试了这个代码,它成功了。

相关内容

  • 没有找到相关文章

最新更新