ASTeterin / OOP

0 stars 0 forks source link

ЗАмечания по stack #12

Open alexey-malov opened 5 years ago

alexey-malov commented 5 years ago
    void Push(T const& data)
    {
        try
        {
            Node* newNode = new Node; //  (1)
            newNode->data = data; // (2)
            newNode->next = m_pTop;
            m_pTop = newNode;
        }
        catch (...)
        {
            throw;
        }
    }

Добавьте в Node конструктор, принимающий строку и указатель на следующий элемент. Тогда если вызвать:

Node* newNode = new Node(data, m_pTop);

Если выбросится исключение во время работы конструктора Node (инициализация поля data), то область памяти под Node будет зачищена в операторе new.

alexey-malov commented 5 years ago
    void Pop()
    {
        if (!IsEmpty())
        {
            m_pTop = m_pTop->next; // (1)
        }
        else
        {
            throw std::logic_error("Stack is empty");
        }
    }
alexey-malov commented 5 years ago
    void Clear()
    {
        if (!IsEmpty())
        {
            while (m_pTop)
            {
                Node* currNode = m_pTop;
                m_pTop = currNode->next;
                delete currNode;
            }
        }
        else
        {
            throw std::logic_error("Stack is empty");
        }
    }
alexey-malov commented 5 years ago
alexey-malov commented 5 years ago
    T GetTop()
    {
        if (!IsEmpty())
        {
            return m_pTop->data;
        }
        else
        {
            throw std::logic_error("Stack is empty");
        }
    }
alexey-malov commented 5 years ago
alexey-malov commented 5 years ago
alexey-malov commented 5 years ago
    struct Node
    {
        Node(T data, Node* next)
            : data(data)
            , next(next)
        {
        }
        T data;
        Node* next;
    };
alexey-malov commented 5 years ago

Код копирования можно сократить до:

            Node* srcCurrentNode = other.m_pTop;
            Node** dstCurrentNode = &m_pTop;
            while (srcCurrentNode)
            {
                *dstCurrentNode = new Node(srcCurrentNode->data, nullptr);
                dstCurrentNode = &(*dstCurrentNode)->next;
                srcCurrentNode = srcCurrentNode->next;
            }
alexey-malov commented 5 years ago
    CMyStack<T> operator=(CMyStack const& other)
    {
        if (this != &other)
        {
            if (m_pTop)
            {
                Clear(); // (1)
            }
            *this = CMyStack(other); // (2)
        }
        return *this;
    }
alexey-malov commented 5 years ago
    CMyStack<T> operator=(CMyStack&& other)
    {
        std::swap(*this, &other);
        return *this;
    }
alexey-malov commented 5 years ago
    void Push(T const& data)
    {
        try
        {
            Node* newNode = new Node(data, m_pTop);
            m_pTop = newNode;
        }
        catch (...)
        {
            throw;
        }
    }
alexey-malov commented 5 years ago
    void Pop()
    {
        if (!IsEmpty())
        {
            Node* tmp = m_pTop;
            try
            {
                m_pTop = m_pTop->next; (1)
            }
            catch (...)
            {
                delete tmp; (2)
            }
        }
        else
        {
            throw std::logic_error("Stack is empty");
        }
    }
alexey-malov commented 5 years ago
    T GetTop() const
    {
        if (!IsEmpty())
        {
            return m_pTop->data;
        }
        else
        {
            throw std::logic_error("Stack is empty");
        }
    }
alexey-malov commented 5 years ago
    CMyStack<T>& operator=(CMyStack&& other)
    {
        if (this != &other)
        {
            Clear();
            this = &other;
        }
        return *this;
    }
alexey-malov commented 5 years ago
            WHEN("using operator =")
            {
                CMyStack<int> other = stack;
                THEN("the elements of the stacks are equal")
alexey-malov commented 5 years ago

Идеальная передача и универсальные ссылки в C++

https://habr.com/ru/post/242639/

alexey-malov commented 5 years ago
alexey-malov commented 5 years ago
    CMyStack<T>& operator=(CMyStack&& other) noexcept
    {
        if (this != &other)
        {
            Clear();
            this->m_pTop = other.m_pTop; // (1)
        }
        return *this;
    }