2016-05-12 7 views
-1

für meine Klasse musste ich eine Klasse "List" implementieren, die std :: deque verwendet, um die Funktionalität einer Liste zu "modellieren" (fragt mich nicht warum). Diese Klasse muss eine Vorlagenklasse sein.Segmentierungsfehler: Kern gedumpt; std :: deque

Ich lese auch, wenn Sie Vorlagen für Klassen verwenden, ist die Trennung der Klasse in Header und CPP-Datei ein bisschen anders. Also habe ich alles in der Header-Datei implementiert.

Wenn ich jedoch ein Objekt von "List" instanziieren und die Elementfunktion "ins" verwenden, um etwas an meine Liste anzufügen, gibt es mir den Segmentierungsfehler nach dem Kompilieren.

Heres mein .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 */ 

und meine main.cpp:

#include <cstdlib> 
#include "List.h" 

using namespace std; 

/* 
* 
*/ 
int main(int argc, char** argv) { 

    List <int> ListInt; 




    ListInt.ins(5); 

    return 0; 
} 

schätze ich jede Art von Hilfe oder konstruktive Kritik. Auch wenn etwas Wichtiges fehlt, zögern Sie nicht, lassen Sie es mich wissen.

Mit freundlichen Grüßen,

Dethe

+2

Befreien Sie sich von 'pos' und' ptrPos' und ersetzen Sie beide durch 'deque :: iterator'. –

+1

Nun, haben Sie mit dem Debugger Ihren Code durchgegangen, um einzuschränken, in welcher Zeile das 'SEGFAULT' tatsächlich auftritt? So weit für _ "konstruktive Kritik" _. –

+0

Können Sie dies unter gdb ausführen und einen StackTrace erhalten? Ich glaube, du missbrauchst das 'pos'ptr durch. '* pos = x' versucht,' x' dem zuzuweisen, auf das 'pos' zeigt. Ich denke stattdessen wollen Sie 'pos = & x' verwenden, das die Adresse von' x' zu 'pos'zuweist. –

Antwort

0

Sie Ausgabe ist mit *pos = x; und nicht std::deque. Wenn Sie ListInt konstruieren, verwenden Sie den Standardkonstruktor, der pos nicht initialisiert. Wenn Sie *pos = x; tun, dereferenzieren Sie einen nicht initialisierten Zeiger, der undefiniertes Verhalten ist und den Absturz verursacht.

Ich bin mir nicht sicher, was Sie versuchen, pos für verwenden, aber es sieht nicht aus wie Sie einen Zeiger überhaupt brauchen.

+0

Nun, ich weiß nicht, wie man die aktuelle Position des Iterators von Deque bekommt. Ich muss zum Beispiel eine Funktion implementieren, die mir sagt, ob der Iterator am Ende meiner Liste steht. Und auch eine Funktion, die den Iterator meiner Liste um i verschiebt. Deshalb habe ich einen anderen Zeiger und einen Zähler benutzt, der mir sagt, an welcher Stelle sich mein Zeiger befindet. Ich bin ein Anfänger, ich weiß es nicht besser:/ – Dethe

+0

@Dethe Wie hast du ein Ende? Ein 'std :: deque' kann wachsen, bis kein Speicher mehr zur Verfügung steht. – NathanOliver

+0

am Ende ich meine das letzte Element meiner Deque – Dethe

Verwandte Themen