2016-05-12 2 views
-1

для моего класса Мне пришлось реализовать класс «Список», который использует 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

+2

Избавьтесь от 'pos' и' ptrPos' и замените оба на 'deque :: iterator'. –

+1

Что ж, вы проделали свой код с помощью отладчика, чтобы сузить, в какой строке на самом деле происходит 'SEGFAULT'? Это далеко за «конструктивную критику». –

+0

Можете ли вы запустить это под gdb и получить стек? Я думаю, вы неправильно используете «pos' ptr. '* pos = x' пытается присвоить' x' тому, что указывает 'pos'. Я думаю, вместо этого вы хотите использовать 'pos = & x', который присваивает адрес' x' 'pos'. –

ответ

0

Вы вопрос с *pos = x; и не std::deque. Когда вы строите ListInt, вы используете конструктор по умолчанию, который не инициализирует pos. Когда вы делаете *pos = x;, вы разыскиваете неинициализированный указатель, который является неопределенным поведением и вызывает сбой.

Я не уверен, что вы пытаетесь использовать pos, но это не похоже на то, что вам нужен указатель.

+0

Ну, я не знаю, как получить текущую позицию итератора deque. Я должен реализовать, например, функцию, которая говорит мне, является ли итератор в конце моего списка. А также функция, которая перемещает итератор моего списка на i. Вот почему я использовал другой указатель и счетчик, который говорит мне, в какой именно позиции мой указатель. Я новичок, я не знаю ничего лучше:/ – Dethe

+0

@Dethe Как у вас есть конец? «Std :: deque» может вырасти до тех пор, пока у вас не закончится память. – NathanOliver

+0

by end Я имею в виду последний элемент моего deque – Dethe

Смежные вопросы