2016-04-29 12 views
0

Ich habe eine verknüpfte List-Klasse, die Vorlagen für die Knoten-Klasse und die List-Klasse verwendet. Ich habe ein Debugging durchgeführt und bin zu dem Schluss gekommen, dass die Member-Funktionen in meiner Node-Klasse nicht auf die Member-Daten zugreifen können, aber die Konstruktoren können. Ich würde gerne wissen, wie ich das beheben kann!Klassenverknüpfte Liste Vorlage Laufzeitfehler

#include <iostream> 
#include <fstream> 
#include <string> 
#include "List.h" 


using namespace std; 


int main() 
{ 
ifstream fileIn("data1.txt"); 

List<int> studentList; 

if(fileIn.fail()) 
    cout << "file did not open" << endl; 
else 

    studentList.add(fileIn); 




fileIn.close(); 
cin.get(); 
cin.ignore(); 
return 0; 

}

//List.h // ignorieren die kommentierten Methoden, haben noch sie zu schreiben.

#ifndef LIST_H 
#define LIST_H 

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Node.h" 

using namespace std; 

template <class NumType> 
class List 
{ 

int counter; 

bool isEmpty(); 
const bool print(){ 
} 

public: 

Node<NumType> * head; 

    List() 
    { 

     this->head = NULL; 
     counter = 0; 
    } 

    ~List() 
    { 

    } 


    //place in an order thart keeps the array in ascending order 
    void add(ifstream &); 
/* 
    Node* location(Node *){ 
    } 

    bool remove(const int){ 
    } 

    bool clear(){ 
    } 

    const void peek(const Node*){ 
    } 

    //average of all test scores or just one students test scores? 
    float average(){ 
    } 

    char grade(){ 
    } 
*/ 
}; 



#include "List.cpp" 
#endif 

//List.cpp

#include "List.h" 


using namespace std; 

template <class NumType> 
bool List<NumType> :: isEmpty() 
{ 
cout << "inside isEmpty" << endl; 
return(head == NULL); 
} 


template <class NumType> 
void List<NumType> :: add(ifstream & fin) 
{ int dummyID; 
NumType tests[3]; 
string dummyName; 


while(fin >> dummyID) 
{  fin.ignore(); 
     getline(fin, dummyName); 

     for(int x = 0; x < 3; x++) 
      fin >> tests[x]; 
     fin.ignore(); 

     cout << dummyID << endl; 
     cout <<dummyName << endl; 
     for(int y = 0; y < 3; y++) 
      cout << tests[y] << " "; 

    if(isEmpty()) 
    { 

     this->head = new Node<NumType>(NULL, tests, dummyID, dummyName); 
     counter++;cout << "inside" << endl; 
    } 
    else 
    { 
     Node<NumType> *newNode = new Node<NumType>(NULL, tests, dummyID, dummyName); 



     Node<NumType> *first = new Node<NumType>(NULL, tests, dummyID, dummyName); 
     Node<NumType> *second; 

     first = this->head; 
     second = this->head->getNext(); 

     //create location() method to handle this! 
     for(int x = 0; x < counter; x++) 
     {   

       if(first->getID() > newNode->getID()) 
       { 
        head = newNode; 

        counter++; 
        break; 
       } 
       else if(first->getID() < newNode->getID() && second->getID() > newNode->getID()) 
       { 

        newNode->setNext(second); 
        first->setNext(newNode); 

        counter++; 
        break; 
       } 
       else if(second->getID() < newNode->getID() && second->getNext() == NULL) 
       { 
        second->setNext(newNode); 

        counter++; 
        break; 
       } 
       else 
       { 
        first = second; 
        second = second->getNext(); 
       } 
     } 

    } 
} 
Node<NumType> * temp = head; 
for(int x = 0; x <= counter; x++) 
{ 
    NumType *arr; 

    cout << temp->getID() << endl << temp->getName() << endl; 
    arr = temp->getAllScores(); 
    for(int y = 0; y <3 ; y++) 
     cout << *(arr+y) << endl; 

    temp = temp->getNext(); 
} 

}

//Node.h

#ifndef NODE_H 
#define NODE_H 


#include <cstdlib> 
#include <iostream> 

using namespace std; 

template <class ItemType> 
class Node 
{ 

    static const int SIZE = 3; 
    int ID; 
    ItemType scores[SIZE]; 
    string name; 
    Node *next; 



public: 

    Node() 
    { 
     this->scores[0] = 0; 
     this->scores[1] = 0; 
     this->scores[2] = 0; 
     this->name = ""; 
     this->ID = 0; 
     this->next = NULL; 
    } 


    Node(Node * nPtr, ItemType tests[], int num, string n) 
    { 
     this->next = nPtr; 

     for(int z = 0; z < SIZE; z++) 
      this->scores[z] = tests[z]; 

     this->ID = num; 
     this->name = n; 
    } 

    ~Node(){} 


    void setNext(Node *); 

    string getName(); 

    int getID(); 


    ItemType* getAllScores(); 

    Node* getNext(); 




}; 

#include "Node.cpp" 
#endif 

Node.cpp

#include "Node.h" 
#include <string> 

using namespace std; 


template <class ItemType> 
void Node<ItemType> :: setNext(Node * nextPtr) 
    { 
     cout << "inside setNext()" << endl; 
     this->next = nextPtr; 
     cout << "exited setNext()" << endl; 
    } 

    template <class ItemType> 
    string Node<ItemType> :: getName() 
    { 
     return (this->name); 
    } 

    template <class ItemType> 
    int Node<ItemType> :: getID() 
    { 
     return (this->ID); 
    } 

    template <class ItemType> 
    ItemType* Node<ItemType> :: getAllScores() 
    { 
     return (this->scores); 
    } 

    template <class ItemType> 
    Node<ItemType> * Node<ItemType> :: getNext() 
    { 
     return (this->next); 
    } 
+0

Nicht sicher, dass dies genau das ist, was Sie beschäftigen, aber geben Sie dies zu lesen: http://stackoverflow.com/questions/495021/why-can-templates-only-be-implementiert-in-the-header- file Ob es Ihr unmittelbares Problem löst oder nicht, es wird viele zukünftige Probleme lösen. – user4581301

+0

Nun, da ich den Code gelesen habe, gibt es zu viele Gründe, warum dieser Code hier nicht funktionieren wird. Stattdessen werde ich ein paar Vorschläge machen. Die Liste weiß viel darüber, was sie enthält. Dies macht es sehr schwer zu sagen, ob ein Fehler in der Listenlogik oder in der Dateneingangslogik und der Verarbeitungslogik vorliegt, insbesondere wenn man bedenkt, dass die Liste eine Vorlage ist. Teile die zwei auf. Schreiben Sie die verknüpfte Liste auf eigene Faust. Testen Sie den Mist, damit Sie wissen, dass Sie Fehler hinzufügen, entfernen, finden und durchgehen können. Schreiben Sie dann eine separate neue Klasse, die Dateidaten liest und speichert. – user4581301

Antwort

0

Ich glaube, ich habe den Fehler gefunden. Das erste Mal, wenn Sie die Methode add ausführen, wird head gesetzt, aber beim zweiten Mal versuchen Sie, den zweiten Wert festzulegen. Sie haben diesen Code

first = this->head;// this is the first element 
second = this->head->getNext(); // this is null (hast been assign yet 

dann Sie in einer for-Schleife gehen, und in der ersten "else if" Anweisung Sie haben dies:

else if(first->getID() < newNode->getID() && second->getID() > newNode->getID()) 

wenn Sie sagen, Zweit-> getID() Sie sagen, dass null-> getID() einen Segmentierungsfehler verursacht.

Ich hoffe, das behebt Ihr Problem. Viel Glück!

+0

das hat sehr geholfen, hat jetzt alles zum arbeiten, vielen Dank: D –

+0

Sie sind herzlich willkommen! Wenn das half, markierte bitte die Antwort als richtig –