Open alexey-malov opened 5 years ago
void Pop()
{
if (!IsEmpty())
{
m_pTop = m_pTop->next; // (1)
}
else
{
throw std::logic_error("Stack is empty");
}
}
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");
}
}
T GetTop()
{
if (!IsEmpty())
{
return m_pTop->data;
}
else
{
throw std::logic_error("Stack is empty");
}
}
struct Node
{
Node(T data, Node* next)
: data(data)
, next(next)
{
}
T data;
Node* next;
};
data(std::move(data))
сделатьКод копирования можно сократить до:
Node* srcCurrentNode = other.m_pTop;
Node** dstCurrentNode = &m_pTop;
while (srcCurrentNode)
{
*dstCurrentNode = new Node(srcCurrentNode->data, nullptr);
dstCurrentNode = &(*dstCurrentNode)->next;
srcCurrentNode = srcCurrentNode->next;
}
CMyStack<T> operator=(CMyStack const& other)
{
if (this != &other)
{
if (m_pTop)
{
Clear(); // (1)
}
*this = CMyStack(other); // (2)
}
return *this;
}
CMyStack<T> operator=(CMyStack&& other)
{
std::swap(*this, &other);
return *this;
}
void Push(T const& data)
{
try
{
Node* newNode = new Node(data, m_pTop);
m_pTop = newNode;
}
catch (...)
{
throw;
}
}
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");
}
}
T GetTop() const
{
if (!IsEmpty())
{
return m_pTop->data;
}
else
{
throw std::logic_error("Stack is empty");
}
}
CMyStack<T>& operator=(CMyStack&& other)
{
if (this != &other)
{
Clear();
this = &other;
}
return *this;
}
WHEN("using operator =")
{
CMyStack<int> other = stack;
THEN("the elements of the stacks are equal")
Идеальная передача и универсальные ссылки в C++
CMyStack<T>& operator=(CMyStack&& other) noexcept
{
if (this != &other)
{
Clear();
this->m_pTop = other.m_pTop; // (1)
}
return *this;
}
Добавьте в Node конструктор, принимающий строку и указатель на следующий элемент. Тогда если вызвать:
Если выбросится исключение во время работы конструктора Node (инициализация поля data), то область памяти под Node будет зачищена в операторе new.