【发布时间】:2016-09-08 17:24:36
【问题描述】:
对于我的班级,我必须实现一个“List”类,它使用 std::deque 来“建模”List 的功能(不要问我为什么)。这个类需要是一个模板类。
我还读到,如果您在类上使用模板,则头文件和 .cpp 文件中的类的分离有点不同。所以我在头文件中实现了所有内容。
但是,如果我实例化一个“List”对象并使用成员函数“ins”将某些内容附加到我的 List 中,编译后会出现分段错误。
这是我的 .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;
}
感谢任何形式的帮助或建设性的批评。 另外,如果缺少任何重要的东西,请不要犹豫,让我知道。
最好的问候,
德特
【问题讨论】:
-
去掉
pos和ptrPos并用deque::iterator替换两者。 -
好吧,您是否使用调试器逐步检查代码以缩小
SEGFAULT实际出现的行? “建设性批评”到此为止。 -
你能在 gdb 下运行它并获得堆栈跟踪吗?我认为您误用了
posptr through。*pos = x正在尝试将x分配给pos指向的内容。我认为您想使用pos = &x将x的地址分配给pos。