В
bool Queue::enqueue(Node * pTail, Data newData)
У вас есть две переменные с именем pTail
. Одним из них является переменная-член Queue::pTail
, но этот член скрыт ( Затенение переменной ) локальным параметром pTail
, совершенно другой переменной, поскольку параметр pTail
был определен в более близкой области.
Node
, на который указывает параметр pTail
, передается по ссылке и является тем же Node
, на который указывает Queue::pTail
, но сам pTail
передается по значению и является просто копией адреса это значение Queue::pTail
. Это означает, что когда вы повторяете pTail
, с
pTail = new Node(pData);
например, pTail
копия повторяется. Оригинал в вызывающей функции остается без изменений.
Решение:
Также передайте указатель по ссылке. Изменить
bool Queue::enqueue(Node * pTail, Data newData)
до
bool Queue::enqueue(Node *& pTail, Data newData)
Примечания:
Data * pData = new Data(newData);
if (pData == nullptr) {
return false;
}
Ничего полезного не делает. Data
, присвоенный pData
, никогда не назначается переменной с более длинной областью действия, поэтому он пропускается при выходе из функции. Кроме того, поведение по умолчанию new
- генерировать исключение при сбое, а не возвращать nullptr
. Поскольку я не вижу, чтобы поведение по умолчанию заменялось где-либо, я подозреваю, что тест для nullptr
никогда не будет использован.
Queue::enqueue
должно выглядеть как
bool Queue::enqueue(Node *& pTail, Data newData) {
if (pTail == nullptr) {
pTail = new Node(pData);
this->pHead = pTail;
}
else {
pTail->setPNext(new Node(pData));
pTail = pTail->getPNext();
}
return true;
}