이전에 몇 개의 링크 된 목록을 만들었으며 개념이 모두 나에게 의미가 있지만 프로젝트의 경우 C++로 템플릿을 만들어야합니다. 나는 곤경에 처해있다. 도와주세요. 나는 그런 간단한 일에 너무 많은 시간을 보냈습니다.C++ templated linked list trouble
이미 목록 클래스 중 일부가 있지만 문제는 여기 어딘가에 있습니다. 나는 테스트 케이스에 세 개의 노드를하고 내가 잘 작동
node1.getNext().show();
를 호출하는 경우, 그들 모두를 연결,하지만
node1.getNext().getNext().show();
내가 segfault의를 얻는 경우 (코어 덤프)합니다. 여기서 뭐가 잘못 됐니? getNext() 및 getPrev()의 반환 값에 대한 포인터를 행운과 함께 여러 번 변경하려고 시도했습니다. 이 질문을하는 것이 어리석은 생각이지만 심각한 문제가 있습니다. 내 노드 클래스는 아래에 있으며, segfault를 제공하는 샘플 테스트 케이스가 뒤 따른다.
Node.h :
template <class T> class Node
{
public:
Node();
Node(T value);
void setPrev(Node<T> node);
void setValue(T value);
void setNext(Node<T> node);
Node<T> getPrev();
T getValue();
Node<T> getNext();
void show();
~Node() { }
private:
Node<T> *prev;
Node<T> *next;
T value;
};
//default construct
template <class T> Node<T>::Node() {
this->prev = NULL;
this->value = NULL;
this->next = NULL;
};
//overloaded construct
template <class T> Node<T>::Node(T value) {
this->prev = NULL;
this->value = value;
this->next = NULL;
}
template <class T> void Node<T>::setPrev(Node<T> node) {
this->prev = &node;
}
template <class T> void Node<T>::setValue(T value) {
this->value = value;
}
template <class T> void Node<T>::setNext(Node<T> node) {
this->next = &node;
}
template <class T> Node<T> Node<T>::getPrev() {
return this->prev;
}
template <class T> T Node<T>::getValue() {
return this->value;
}
template <class T> Node<T> Node<T>::getNext() {
return this->next;
}
template <class T>
void Node<T>::show() {
cout << value << endl;
}
테스트 케이스 : 당신은 포인터로 이전/다음 멤버를 저장해야
int main(int argc, char **argv) {
typedef Node<int> IntNode;
IntNode head(NULL);
IntNode node1(23);
IntNode node2(45);
IntNode node3(77);
IntNode tail(NULL);
node1.setPrev(head);
node1.setNext(node2);
node2.setPrev(node1);
node2.setNext(node3);
node3.setPrev(node2);
node3.setNext(tail);
node1.show();
node2.show();
node3.show();
cout << node1.getNext().getValue() << endl;
cout << node1.getNext().getNext().getValue() << endl;
}
'std :: list'를 학습 프로젝트로 다시 구현하고 있습니까? –
setPrev/setNext 대신 append를 구현하고 내부에서 포인터를 연결해야합니다. 그렇지 않으면 클래스의 동기 인 데이터 숨기기가 효과적이지 않습니다. 외부에서 처리되는 '하드'로직입니다. – CapelliC