【问题标题】:C++ error C2819: type 'List' does not have an overloaded member 'operator ->'C++ 错误 C2819:类型 'List' 没有重载成员 'operator ->'
【发布时间】:2010-12-22 22:56:58
【问题描述】:

我不断收到此错误 -

错误 C2819:类型“列表”没有 一个重载的成员 'operator ->'

我不知道为什么?帮忙?

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;
 }
}

List.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

List.cpp -

#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

注意:我知道我在做的只是一个列表,但对于拼贴课我必须这样做:) -任何帮助/指示/如何更好地做事都会很棒!!!

【问题讨论】:

  • 使用 -> 语法只有当你的变量是一个指针,否则使用。
  • 请注意,最好提供一个重现问题的最小可编译示例,然后将所有代码扔给我们。您也不会在准备时才想到解决方案。

标签: c++ pointers class compiler-errors


【解决方案1】:

不能两者兼得:

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

前者有效,因为您通过值传递list,但要使后者有效,您需要重载operator-&gt;。只需使用:

Node * temp2 = list.getLast();

注意:在 C++ 中,访问聚合成员(数据成员或函数)的语法是:

T.member if T is an aggregate type

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

(好的,我已经简化了一点,但这应该可以帮助您入门。)

【讨论】:

  • '->' 运算符与 '.' 的区别是什么? ?
  • Wallter,通常,a-&gt;b 等价于(*a).b
【解决方案2】:

list 不是一个指针 节点 * temp2 = list->getLast();

【讨论】:

    【解决方案3】:

    Node * temp2 = list-&gt;getLast(); 更改为Node * temp2 = list.getLast(); 将使其工作,但我认为这不是最好的解决方案。您正在将列表按值传递给PrintList(),这将调用复制构造函数。更好的方法是传入一个const 对列表的引用。不过,您仍然需要将 -&gt; 更改为 .

    【讨论】:

      【解决方案4】:

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

      无效打印列表(列表列表)

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

      列表 * listptr = 新列表(); listptr->getFirst(); listptr->getLast();

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

      您可以创建自定义 -> 运算符,但我认为这不是您真正想要做的。

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

      【讨论】:

        【解决方案5】:

        注意这一点

        *Node * temp2 = list->getLast();*

        list 应该是一个对象,而不是一个指针,因此你不应该使用“->”,而应该使用“.”

        【讨论】:

          猜你喜欢
          • 2016-12-18
          • 1970-01-01
          • 2019-03-01
          • 1970-01-01
          • 2022-01-07
          • 2020-03-14
          • 1970-01-01
          • 1970-01-01
          • 2019-01-25
          相关资源
          最近更新 更多