Мне нужно сделать глубокую копию, правильно ли я использую свой конструктор копирования? - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно сделать глубокую копию. Я правильно использую свой конструктор копирования? Что я должен изменить?

#include <iostream>
#include <sstream>
using namespace std;

class LinkedList
{
    public:
        int data;
        LinkedList* prevNode;

        LinkedList()
        {
            int dd = 0;
            prevNode = nullptr;
        }

        LinkedList(int dd, LinkedList* pr)
        {
            data = dd;
            prevNode = pr;
        }
};

class Stack
{
    private:
        LinkedList* topNode;

    public:
        Stack();
        Stack(const Stack& original);
        ~Stack();

        bool isEmpty() const;
        int top() const;
        int pop();
        void push(int);
};

Stack::Stack()
{
    topNode = nullptr;
}

Stack::Stack(const Stack& original)
{
    this->topNode = original.topNode;
}

Stack::~Stack()
{
    while (!isEmpty())
    {
        pop();
    }
}

bool Stack::isEmpty() const
{
    if (topNode == NULL)
    {
        return true;
    }
    return false;
}

int Stack::top() const
{
    if (isEmpty())
    {
        throw runtime_error("error: stack is empty");
    }
    return topNode->data;
}

int Stack::pop()
{
    int topVal = top();

    LinkedList* oldtop = topNode;
    topNode = topNode->prevNode;
    return topVal;
}

void Stack::push(int newData)
{
    LinkedList* newNode = new LinkedList(newData, topNode);
    topNode = newNode;
}

int returnNumber(string inputString)
{
    istringstream fr(inputString); 
    int number;

    while (fr >> number)
    { 
        return number;
    }
    if (fr.fail())
    {
        throw runtime_error("error: not a number");
    }

    return number;
}

void list(Stack s)
{
    cout << "[";
    while (!s.isEmpty())
    {
        cout << s.pop();
        if (!s.isEmpty())
        {
            cout << ",";
        }
    }
    cout << "]" << endl;
}

void readCommands(Stack& newStack)
{
    string command = " ";
    while (command != "end")
    {
        cout << "stack> ";
        cin >> command;
        cout << endl;
        if (cin.eof())
        {
            break;
        }

        try 
        {
            if (command == "top")
            {
                cout << newStack.top() << endl;
            }
            else if (command == "pop")
            {
                cout << newStack.pop() << endl;
            }
            else if (command == "push")
            {
                string inputValue;
                cin >> inputValue;

                int number = returnNumber(inputValue);
                newStack.push(number);
                cin.ignore();
            }
            else if (command == "list")
            {
                list(newStack);
            }
            else
            {  
                if (command != "end")
                {
                    throw runtime_error("error: invalid command");
                }
            }
        }
        catch (runtime_error e)
        {
            cout << e.what() << endl;
        } 
    }
}

int main()
{
    Stack newStack;

    readCommands(newStack);
    return 0;
}

1 Ответ

2 голосов
/ 18 октября 2019

Мне нужно сделать глубокую копию, правильно ли я использую свой конструктор копирования?

Нет. Чтобы сделать глубокое копирование, вам нужно выделить новое пространство в новом стеке. Это будет выглядеть примерно так:

class LinkedList
    {
        public:
             static LinkedList* Copy(LinkedList* c) {
                  if(c == nullptr) {
                       return nullptr;
                  } else {
                      return new LinkedList(data, Copy(prevNode));
                  }
             }
};

Эта статическая функция берет любой указатель и создает копию его значения и списка.

Затем внутри вашего стека:

Stack::Stack(const Stack& original)
    {
        this->topNode = LinkedList::Copy(original.topNode);
    }

Делая это таким образом, вы фактически создаете новую память, а не копируете указатель вслепую. Это большая идея глубоких копий.

Если вы все еще не понимаете, как работают глубокие копии, я бы посоветовал обратиться к вашему учебнику или профессору.

...