2011-03-16 2 views
1

Je n'ai pas utilisé de pointeurs depuis plus de 3 ans et je suis très rouillé sur ce sujet. J'ai reçu une tonne d'erreurs lorsque je compile le code suivant. Les erreurs sont les suivantes:Pointer Compiler Problèmes

[email protected]:~/Desktop/stuff$ g++ test.cpp LinearNode.cpp LinkedList.cpp 

LinkedList.cpp: In member function ‘void LinkedList::add(int)’: 

LinkedList.cpp:26: error: request for member ‘getElement’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:31: error: request for member ‘getNext’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:39: error: request for member ‘setPrevious’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:40: error: cannot convert ‘LinearNode’ to ‘LinearNode*’ in assignment 

LinkedList.cpp: In member function ‘int LinkedList::remove(int)’: 

LinkedList.cpp:60: error: request for member ‘getElement’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:62: error: request for member ‘getElement’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:63: error: request for member ‘getNext’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 

LinkedList.cpp:67: error: invalid conversion from ‘LinearNode*’ to ‘int’ 

LinkedList.cpp:67: error: initializing argument 1 of ‘LinearNode::LinearNode(int)’ 

LinkedList.cpp:68: error: request for member ‘getNext’ in ‘((LinkedList*)this)->LinkedList::contents’, which is of non-class type ‘LinearNode*’ 
LinkedList.cpp: In member function ‘void LinkedList::print()’: 
LinkedList.cpp:97: error: invalid conversion from ‘LinearNode*’ to ‘int’ 
LinkedList.cpp:97: error: initializing argument 1 of ‘LinearNode::LinearNode(int)’ 

Lié list.h:

#ifndef LINKEDLIST_H 
#define LINKEDLIST_H 
#include<iostream> 
#include"LinearNode.h" 

using namespace std; 

class LinearNode; 

class LinkedList 
{ 
    public: 
     LinkedList(); 
     void add(int element); 
     int remove (int element); 
     void print(); 

    private: 
     int count; 
     LinearNode* contents; 
};//ends the class linked list 

#endif 

liste chaînée:

#include<iostream> 
#include"LinearNode.h" 
#include"LinkedList.h" 

using namespace std; 

//linkedlist constructor for an empty linked list 
LinkedList::LinkedList() 
{ 
    count = 0; 
    contents = NULL; 
}//ends the constructor 

//adds an element to the front of the linked list 
void LinkedList::add(int element) 
{ 
    int found = 0, current = 0; 

    for (int index = 0; index < count; index++) 
    { 
     if (contents.getElement() == element) 
      found = 1; 
     else  
     { 

      contents = *contents.getNext(); 
     }//ends the else statement 
    }//ends the while loop 

    if (found == 0) 
    { 
     LinearNode node(element); 
     node.setNext(contents); 
     contents.setPrevious(&node); 
     contents = node; 
     count++; 

//print(); 
cout << endl; 

    }//ends the found == 0 if statment 
}//ends the add function 

//this function removes one element from the linked list. 
int LinkedList::remove(int element) 
{ 
    int found = 0, result = 0; 
    LinearNode previous; 
    LinearNode current; 

    if (count == 0) 
     cout << "The list is empty" << endl; 
    else 
    { 
     if (contents.getElement() == element) 
     { 
      result = contents.getElement(); 
      contents = *contents.getNext(); 
     }//ends the contents.getElement() == element 
     else 
     { 
      previous = contents; 
      current = *contents.getNext(); 
      for (int index = 0; ((index < count) && (found == 0)); index++) 
       if (current.getElement() == element) 
        found = 1; 
       else 
       { 
        previous = current; 
        current = *current.getNext(); 
       }//ends the else statement 

      if (found == 0) 
       cout << "The element is not in the list" << endl; 
      else 
      { 
       result = current.getElement(); 
       previous.setNext(current.getNext()); 
      }//ends else statement 

     }//ends the else stamtement 

     count--; 
    }//ends the else statement of count == 0 
    return result; 
}//ends the remove function 


void LinkedList::print() 
{ 
    LinearNode current; 
    current = contents; 

    for (int index = 0; index < count; index++) 
    { 
     cout << current.getElement() << endl; 
     current = *current.getNext(); 
    }//ends the for loop 
}//ends Print function 

LinearNode.h:

#ifndef LINEARNODE_H 
#define LINEARNODE_H 

#include<iostream> 

using namespace std; 

class LinearNode 
{ 
    public: 
     //Constructor for the LinearNode class that takes no arguments 
     LinearNode(); 
     //Constructor for the LinearNode class that takes the element as an argument 
     LinearNode(int el); 
     //returns the next node in the set. 
     LinearNode* getNext(); 
     //returns the previous node in the set 
     LinearNode* getPrevious(); 
     //sets the next element in the set 
     void setNext(LinearNode* node); 
     //sets the previous element in the set 
     void setPrevious(LinearNode* node); 
     //sets the element of the node 
     void setElement(int el); 
     //gets the element of the node 
     int getElement(); 

    private: 
     LinearNode* next; 
     LinearNode* previous; 
     int element;   
};//ends the LinearNode class 

#endif 

LinearNode:

#include<iostream> 
#include"LinearNode.h" 

using namespace std; 

//Constructor for LinearNode, sets next and element to initialized states 
LinearNode::LinearNode() 
{ 
    next = NULL; 
    element = 0; 
}//ends LinearNode default constructor 

//Constructor for LinearNode takes an element as argument. 
LinearNode::LinearNode(int el) 
{ 
    next = NULL; 
    previous = NULL; 
    element = el; 
}//ends LinearNode constructor 

//returns the next element in the structure 
LinearNode* LinearNode::getNext() 
{ 
    return next; 
}//ends getNext function 

//returns previous element in structure 
LinearNode* LinearNode::getPrevious() 
{ 
    return previous; 
}//ends getPrevious function 

//sets the next variable for the node 
void LinearNode::setNext(LinearNode* node) 
{ 
    next = node; 
}//ends the setNext function 

//sets previous for the node 
void LinearNode::setPrevious(LinearNode* node) 
{ 
    previous = node; 
}//ends the setPrevious function 

//returns element of the node 
int LinearNode::getElement() 
{ 
    return element; 
}//ends the getelement function 

//sets the element of the node 
void LinearNode::setElement(int el) 
{ 
    element = el; 
}//ends the setElement function 
+1

Si vous avez juste besoin d'une liste chaînée de travail, vous pouvez utiliser la [liste STL] (http://www.yolinux.com /TUTORIALS/LinuxTutorialC++STL.html#LIST) pour en obtenir un qui a déjà été débogué. [cplusplus.com a une référence plus détaillée] (http://cplusplus.com/reference/stl/list/) si vous voulez plus d'informations sur le modèle de liste STL. – sarnold

+0

@sarnold Cela pourrait être une question de devoirs. – mgiuca

+0

@mgiuca, en effet, ou une tentative d'obtenir des bons conseils avant une entrevue d'emploi :) mais si cela fait un moment que l'affiche originale a fait C++, il ou elle peut ne pas être familier avec la gamme étonnante de puissants pré-écrite outils. – sarnold

Répondre

3

Il y a un certain nombre d'erreurs distinctes ici, mais celui au sujet des pointeurs est que vous utilisez le point (.) pour accéder aux membres d'un pointeur à -classe. Le point est pour accéder aux membres d'un objet de classe (pas un pointeur). Vous devez utiliser la flèche (->) pour accéder aux membres d'un pointeur vers une classe.

Par exemple,

if (contents.getElement() == element) 

devrait être

if (contents->getElement() == element) 
2

Puisque vous utilisez un pointeur pour contents, vous devez le déférer correctement pour accéder aux membres. Par exemple, la première erreur est causée par LinkedList::add:

void LinkedList::add(int element) 
{ 
    int found = 0, current = 0; 

    for (int index = 0; index < count; index++) 
    { 
     // This is your first error 
     //if (contents.getElement() == element) 

     // Change to: 
     if (contents->getElement() == element) 
      found = 1; 
2

. a une priorité plus élevée sur *. Donc, changer

contents = *contents.getNext(); 

à

contents = (*contents).getNext(); 

Et vous devez corriger à plusieurs endroits.

Si vous avez besoin de se débarrasser de tout cela, il suffit d'utiliser -

contents = contents->getNext(); 
+2

C'est correct, mais c'est plutôt étrange de voir '(* contenu) .getNext()'. Vous devriez plutôt utiliser le style plus conventionnel 'contents-> getNext()', ce qui signifie la même chose. Notez également que la plupart des endroits où un point est utilisé n'ont pas de '* '. – mgiuca

+0

@mguica - Vous avez raison. L'utilisation de '->' est facile et lisible. Je le signale parce qu'il est utilisé dans un extrait. – Mahesh