代码之家  ›  专栏  ›  技术社区  ›  Wallter

C++错误C219:类型“列表”没有重载成员“运算符->”

  •  0
  • Wallter  · 技术社区  · 16 年前

    我一直在犯这个错误-

    错误C2819:类型“列表”没有

    我不明白为什么?帮忙?

    Main.cpp -

    #include <iostream>
    #include <string>
    #include <cassert>
    using namespace std;
    
    #include "List.h"
    #include "Node.h"
    

    错误发生在这里:

    void PrintList ( List list ) {
     Node * temp = list.getFirst();
     Node * temp2 = list->getLast();
     while ( temp->getItemName() != temp2->getName() ) {
      cout << temp.getItemName() << endl;
     }
    }
    

    清单h -

    #ifndef LIST_H
    #define LIST_H
    
    #include "Node.h"
    class List
    {
    private:
     Node * First;
     Node * Last;
     int num_in_list;
    public:
     List () { num_in_list = 0; First = NULL; Last = NULL; }
     int get_num_in_list() { return num_in_list; }
     Node * getFirst() { return First; }
     Node * getLast() { return Last; }
     void del_frnt ();
     void push_front (Node *);
     void push_back (Node *);
     void del_last ();
     void add (Node*);
     Node * pop_back ();
     Node * pop_front ();
     int search_item_list (string);
     Node * get (int);
    };
    #endif
    

    -

    #include <iostream>
    #include <string>
    #include <cassert>
    #include "Node.h"
    #include "List.h"
    using namespace std;
    
    Node * List:: get ( int position_of_node ) {
     assert ( First != NULL);
     Node * temp = First;
     for (int i = 1; i < position_of_node; i++) 
      { temp = temp->getNext(); }
     return temp;
    }
    
    int List:: search_item_list (string item_searching_for ) {
     assert (First != NULL && num_in_list != 0);
     int counter = 1;
     Node * temp = First;
     while ( temp->getItemName() != item_searching_for || temp->getNext() == NULL )
      { temp = temp->getNext(); counter++; }
     return counter;
    }
    
    void List:: add (Node * node_to_be_added) {
     if (num_in_list == 0) { First = node_to_be_added; Last = node_to_be_added; }
     else if (num_in_list != 0 ) {
      Last->setNext(node_to_be_added);
      node_to_be_added->setPrevous(Last);
      Last = node_to_be_added;
     }
     num_in_list++;
    }
    
    Node * List :: pop_back ( ) {
     assert (Last != NULL);
     if ( num_in_list > 1) {
      Node * temp = Last;
      Last = Last->getPrevous();
      Last->setNext(NULL);
      temp->setNext(NULL);
      temp->setPrevous(NULL);
      return temp;
     }
     else if ( num_in_list == 1 ) {
      Node * temp = First;
      First = NULL;
      return temp;
     }
     else return NULL;
    }
    
    Node * List:: pop_front ( ) {
     assert ( First != NULL && num_in_list > 0);
     if ( num_in_list > 1 ) {
      Node * temp = First;
      First = First->getNext();
      First->setPrevous(NULL);
      temp->setNext(NULL);
      temp->setPrevous(NULL);
      return temp;
     }
    
     else if ( num_in_list == 1) {
      Node * temp = First;
      First = NULL;
      return temp;
     }
     else return NULL;
    }
    
    void List:: del_last ( ) {
     assert ( Last != NULL );
     if ( num_in_list > 1) {
      Node * temp_node = Last->getPrevous();
      Node * new_last = Last;
      temp_node->setNext(NULL);
      delete new_last;
      num_in_list--;
     }
     else if ( num_in_list == 1) {
      Node * temp = First;
      delete temp;
      num_in_list = 0;
      First = NULL;
     }
    }
    
    void List:: del_frnt ( ) {
     assert ( First != NULL);
     if ( num_in_list > 1) {
      Node * saveFirst = First;
      First->getNext()->setPrevous(NULL);
         First = First->getNext( );
         delete saveFirst;
         num_in_list--;
     }
     else if ( num_in_list == 1 ) {
      Node * saveFirst = First;
      delete saveFirst;
      num_in_list = 0;
      First = NULL;
     }
    }
    
    void List:: push_back (Node * new_node) {
     assert ( Last != NULL );
     Last->setNext(new_node);
     new_node->setPrevous(Last);
     Last = new_node;
     num_in_list++;
    }
    
    void List:: push_front (Node * new_node) {
     if ( First != NULL) {
      First->setPrevous(new_node);
      new_node->setPrevous(NULL);
      new_node->setNext(First);
      First = new_node;
      num_in_list++;
     }
     else if ( First == NULL ) {
      First = new_node;
      Last = new_node;
      num_in_list = 1;
     }
    }
    

    Node.h -

    #ifndef NODE_H
    #define NODE_H
    #include <string>
    using namespace std;
    
    class Node 
    {
    private:
     string ItemName;
     string Quantity;
     Node * Next;
     Node * Prevous;
    public:
     Node () { ItemName = " "; Quantity = " "; }
     void setItemName (string a) { ItemName = a; }
     string getItemName () { return ItemName; }
     void setQuantity (string a) { Quantity = a; }
     string getQuantity () { return Quantity; }
     void setNext (Node * a) { *Next = *a; }
     Node * getNext () { return Next; }
     void setPrevous (Node * a) { *Prevous = *a; }
     Node * getPrevous () { return Prevous; }
    };
    #endif
    

    注意:我知道我正在做的只是一个列表,但对于一个拼贴类,我必须这样做:) -任何帮助/建议/如何做得更好都将是 伟大的

    5 回复  |  直到 16 年前
        1
  •  7
  •   dirkgently    16 年前

    不能两者兼而有之:

    Node * temp = list.getFirst();
    Node * temp2 = list->getLast();
    

    前一个在你经过的时候起作用 list operator-> 超载。只需使用:

    Node * temp2 = list.getLast();
    

    T.member if T is an aggregate type
    

    和

    T->member if T is a pointer to an aggregate type
    

    (好的,我简化了一点,但这应该可以帮助您开始。)

        2
  •  1
  •   Al Crowley    16 年前

    在PrintList函数中,有一个List类型的参数:

    void PrintList ( List list )
    

    当您尝试使用list.getFirst()访问它时,一切正常。当您尝试执行列表时->getLast()编译器生成一个错误,告诉您变量不是指针类型。在短打印列表函数中,您可能希望替换所有->用这个。操作人员如果要使用->,您必须执行以下操作:

    List * listptr = new List();
    listptr->getFirst();
    listptr->getLast();
    

    否则,只需将第二行替换为:Node*temp2=list.getLast();

    您可以创建自定义->接线员,但我认为这不是你真正想做的。

    另外,我没有仔细研究它,但是您的while循环是否会终止?除非对getItemName的调用将改变节点的值,否则这看起来可能会永远持续下去。

        3
  •  0
  •   user224003    16 年前

    列表不是中的指针

        4
  •  0
  •   Adam    16 年前

    改变 Node * temp2 = list->getLast(); 到 Node * temp2 = list.getLast(); 会成功的,但我不认为这是最好的解决方案。您正在将列表传递到 PrintList() const -> 到 . 不过。

        5
  •  0
  •   Liz Albin    16 年前

    注意这一点

    *节点*temp2=列表->getLast()*

    推荐文章