У меня есть программа, которая создает очередь стеков, и у каждого стека есть несколько узлов с одной связью, в которых есть объекты класса «функции», который я создал. Однако всякий раз, когда я пытаюсь вызвать мой код очереди, возникает ошибка.
При первом появлении ошибки отслеживается такой вызов:
Executive.cpp : q.enqueue(*thisStack);
myQueue.cpp [enqueue method] : m_back->setNext(newNode);
SLNode.h [setNext method]: setNext(SLNode<T>* nextSLNode) {next = nextSLNode;}
Я не уверен, что создает ошибку сегмента. Я запустил тест, и новый узел, созданный в enqueue, содержит все необходимые данные, поэтому я знаю, что он не пустой. По какой-то причине кажется, что все работает правильно, пока не достигнет метода setNext, и я не могу понять, почему он не будет запускать код.
ОДНОЗНАЧНЫЕ УЗЛЫ
#ifndef SLNODE_H
#define SLNODE_H
#include <iostream>
template <typename T>
class SLNode // A node in a singly linked list
{
private:
T item;
SLNode<T>* next; // we can only go "forward" along our chain
public:
SLNode(T anItem) : item(anItem), next(nullptr) {}
SLNode(T anItem, SLNode<T>* nextSLNode) : item(anItem),
next(nextSLNode) {}
T getItem() const { return item; }
SLNode<T>* getNext() const { return next; }
void setItem(T newItem) { item = newItem; }
void setNext(SLNode<T>* nextSLNode) { next = nextSLNode; }
};
#endif
ЗАГОЛОВОК ОЧЕРЕДИ
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include "SLNode.h"
#include "QueueInterface.h"
#include "myQueue.h"
#include "function.h"
#include <string>
#include <iostream>
template<typename ItemType>
class myQueue: public QueueInterface<ItemType>
{
public:
myQueue();
bool isQueueFull(SLNode<ItemType>* node);
bool isEmpty() const;
void enqueue(const ItemType& newEntry); // throw (PrecondViolatedExcep) = 0;
void dequeue (); // throw (PrecondViolatedExcep) = 0;
ItemType peekFront() const; // throw (PrecondViolatedExcep) = 0;
private:
SLNode<ItemType>* m_front;
SLNode<ItemType>* m_back;
};
#include "myQueue.cpp"
#endif // MYQUEUE_H
СПОСОБ СПРАВКИ
template<typename ItemType>
void myQueue<ItemType>::enqueue (const ItemType& newEntry)
{
//create new node of ItemType and fill with given entry
SLNode<ItemType>* newNode = new SLNode<ItemType>(newEntry);
std::cout << "new queue node created\n";
/*ItemType tester = m_back->getItem();
std::cout << "new node functions properly\n";
std::cout << tester.getProcessName() << std::endl;*/
if(isQueueFull(newNode) == true)
{ throw PrecondViolatedExcep("Queue/Memory full."); }
else
{
std::cout << "inside else statement\n";
//point back to new node
m_back->setNext(newNode);
std::cout << "last node pointing to new node\n";
//set back to new node
m_back = newNode;
std::cout << "new node is now back\n";
}
}
РАБОТА
:~/EECS268/Lab_05$ ./Lab_05 example.txt
start begun
load : 'y' ,0
process added to stack.
read : 'n' ,0
process added to stack.
play : 'n' ,0
process added to stack.
0 : 'S' ,0
new queue node created
inside else statement
Segmentation fault (core dumped)