для моего класса Мне пришлось реализовать класс «Список», который использует std :: deque для «моделирования» функциональности списка (не спрашивайте меня почему). Этот класс должен быть классом шаблона.Ошибка сегментации: ядро сбрасывается; std :: deque
Я также читал, если вы используете шаблоны в классах, разделение класса в заголовке и .cpp-файле немного отличается. Поэтому я реализовал все в файле заголовка.
Однако, если я создаю экземпляр объекта «Список» и использую функцию-член «ins», чтобы добавить что-то в свой список, он дает мне ошибку сегментации после компиляции.
Heres моей .h:
#ifndef LIST_H
#define LIST_H
#include <deque>
#include <iostream>
template <typename T>
class List {
public:
List();
void del();
void ins(T x);
void adv();
void end();
void reset();
void setEnd();
T get();
private:
std::deque<T>deque;
T *pos;
int ptrPos = 0;
T element;
};
template <typename T>
List<T>::List(){};
template <typename T>
void List<T>::ins(T x){
deque.push_back(x);
*pos = x;
ptrPos++;
}
template <typename T>
void List<T>::del(){
deque.erase(ptrPos);
*pos = deque.at(ptrPos);
}
template <typename T>
void List<T>::adv(){
ptrPos++;
*pos = deque.at(ptrPos);
}
template <typename T>
void List<T>::end(){
if(ptrPos == deque.size()){
std::cout << "Der Positionszeiger zeigt auf das Ende der Liste" << std::endl;
}else{
std::cout << "Der Positionszeiger zeigt NICHT auf das Ende der Liste" << std::endl;
}
}
template <typename T>
void List<T>::setEnd(){
ptrPos = deque.size();
*pos = deque.at(ptrPos);
}
template <typename T>
T List<T>::get(){
return deque.at(ptrPos);
}
template <typename T>
void List<T>::reset(){
*pos = deque.at(1);
ptrPos = 1;
}
#endif /* LIST_H */
и моей main.cpp:
#include <cstdlib>
#include "List.h"
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
List <int> ListInt;
ListInt.ins(5);
return 0;
}
Я ценю любую помощь или конструктивную критику. Также, если ничего важного не хватает, не стесняйтесь, дайте мне знать.
С наилучшими пожеланиями,
Dethe
Избавьтесь от 'pos' и' ptrPos' и замените оба на 'deque :: iterator'. –
Что ж, вы проделали свой код с помощью отладчика, чтобы сузить, в какой строке на самом деле происходит 'SEGFAULT'? Это далеко за «конструктивную критику». –
Можете ли вы запустить это под gdb и получить стек? Я думаю, вы неправильно используете «pos' ptr. '* pos = x' пытается присвоить' x' тому, что указывает 'pos'. Я думаю, вместо этого вы хотите использовать 'pos = & x', который присваивает адрес' x' 'pos'. –