Warning:control reaches end of non-void function
Программа работает с переменным успехом,выдает такие ошибки как "Недостаточно места в куче" или предупреждение Warning:control teaches end of non-void function( в методе перегрузки оператора [ ]).
Задача такова:нужно написать стек на основе односвязного списка,реальзовать функции pop() и push(),создать глобальную функцию,которая разбивает число на простые множетели и хранит их в стеке и потом мы выводим их на консоль.
#include<iostream>
#include <iomanip>
using namespace std;
template<class INF, class FRIEND>
class ListNode // узел(элемент)
{
private:
INF data; //данные
ListNode * pnext; //указатель на след элемент односвязного списка
ListNode() //реализация конструктора
{
data = 0;
pnext = nullptr;
}
~ListNode()//деструктор
{
delete[] pnext;
}
friend FRIEND;
};
template<class INF>
class Stack
{
private:
typedef class ListNode < INF, Stack <INF> > Node;//класс Stack это дружественный класс к кдассу ListNode. Node это новое имя(для удобства)
Node *head;// указатель на первый элемент
int size; // размер стека
public:
Stack();// конструктор
//Stack(Stack& other);
~Stack(); //деструктор
void clear();// очистить стек
void push(INF obj); // поместить элемент в стек
void pop();// удалить элемент из стека
//void printStack(); //функция печати стека
INF & operator[](const int index);
int GetSize()
{
return size;
}
};
template<class INF>
inline Stack<INF>::Stack()
{
head = nullptr;
size = 0;
}
template<class INF>
inline Stack<INF>::~Stack()
{
clear();
}
template<class INF>
inline void Stack<INF>::clear()
{
while (size)// пока в списке есть элементы мы будем удалять первый элемент списка
{
pop();
}
}
template<class INF>
void Stack<INF>::push(INF obj)
{
Node *temp = new Node;
temp->data = obj;// заносим данные во временную переменную
if (head == nullptr)// проверка есть ли в стеке первый элемент
temp->pnext = nullptr;//если нет то делаем временную переменную которая указвает на след элемент стека null
else
temp->pnext = head;// если есть то делаемэту временуую переменную указвающую на след элемент головой
head = temp;
size++;
}
template<class INF>
void Stack<INF>::pop()
{
Node *temp = head;// временный объект который хранит первый элеиент
head = head->pnext;// хранит адрес след элемента после первого(после head)
delete temp;// удаляем бывший первый элемент
size--;
}
template<class INF>
inline INF & Stack<INF>::operator[](const int index)
{
int counter = 0;
Node *current = this->head;
while (current != nullptr)
{
if (counter == index)
{
return current->data;
}
current = current->pnext;
counter++;
}
}
void Multipliers(int n, Stack <int> &stack)//(число,которое нужно разбить на мнж,простые множители)
{
system("chcp 1251 > null");
int div = 2;
cout << "Введите число" << endl;
while (n > 1)
{
while (n % div == 0)
{
//cout << "*" << endl;
stack.push(div);
n = n / div;
}
div++;
}
}
int main()
{
system("chcp 1251 > null");
int n = 245;
Stack <int> s;
Multipliers(n, s);
for (int i = 0; i < s.GetSize(); i++)
{
cout << s[i] << endl;
}
system("pause");
return 0;
}
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Деструктор ListNode - удаляет следующий элемент, думая, что это его личный массив.
~ListNode()//деструктор
{
delete[] pnext; // ошибка
}
Не трогайте указатель, Сам список Stack всё удалит.
~ListNode()//деструктор
{
}