0

我正在做一个任务,我被要求在 C++ 中实现一个链表。到目前为止,除了我创建一个新列表时,一切都很好。在我的方法create_list()中。在我为我分配内容和 ID 号Field并尝试调用后,GetNext()我收到一条错误消息:Request for member 'GetNext()' in 'Node' which is a non-class type '*Field'.我对 C++ 语法和面向对象编程仍然很陌生。我究竟做错了什么?我认为通过使用Field *Node = new Field(SIZE, EMPTY);我的变量Node将是类类型的行Field......?

#include <iostream>
#include <ctype.h>

using namespace std;

typedef enum { EMPTY, OCCUPIED } FIELDTYPE;

// Gameboard Size
int SIZE;  

class Field {

private:
int _SquareNum; 
FIELDTYPE _Content; 
Field* _Next;

public: 
// Constructor
Field() { }

// Overload Constructor
Field(int SquareNum, FIELDTYPE Entry) { _SquareNum = SquareNum; _Content = Entry; }

// Get the next node in the linked list
Field* GetNext() { return _Next; }

// Set the next node in the linked list
void SetNext(Field *Next) { _Next = Next; }

// Get the content within the linked list
FIELDTYPE GetContent() { return _Content; }

// Set the content in the linked list
void SetContent(FIELDTYPE Content) { _Content = Content; }

// Get square / location 
int GetLocation() { return _SquareNum; }

// Print the content
void Print() { 

    switch (_Content) {

        case OCCUPIED: 
            cout << "Field " << _SquareNum << ":\tOccupied\n"; 
            break;
        default:
            cout << "Field " << _SquareNum << ":\tEmpty\n";
            break;
    }

} 

}*Gameboard;

这是我的 create_list() 方法:

void create_list()
{
int Element; 


cout << "Enter the size of the board: ";
cin >> SIZE; 
for(Element = SIZE; Element > 0; Element--){
    Field *Node = new Field(SIZE, EMPTY);
    Node.GetNext() = Gameboard; // line where the error is 
    Gameboard = Node;
    }
}
4

4 回答 4

3

.用于寻址对象中的成员和对对象的引用。Node但是,它是指向对象的指针。所以你需要先把它变成一个参考,然后才能和.. 这意味着做(*Node).GetNext(). 或者你可以使用简写:Node->GetNext()- 这两个是完全等价的。

一个很好的助记符是你使用带指针的尖运算符:)

于 2012-11-01T06:23:21.640 回答
1

您正在调用Node.GetNext(),但Node它是一个指针。您需要使用->运算符而不是.运算符,如Node->GetNext().

于 2012-11-01T06:23:17.333 回答
1

声明中没有

Field *Node = new Field(SIZE, EMPTY);

节点是指向字段的类型指针。

如果您有一个指向类的指针并且您想访问该类的成员,则修复很简单->

Node->GetNext() = Gameboard;

我认为您的代码还有其他错误,而且我认为即使有了这个“修复”它也不会起作用。可能你真正想要的是

Node->SetNext(Gameboard);
于 2012-11-01T06:24:45.963 回答
0

如果要设置为左值,该函数必须返回一个参考值。您的代码需要一些更改:

// Get the next node in the linked list
Field& GetNext() { return *_Next; }

那么您可以将该函数用作左值

Node->GetNext() = *Gameboard; 
于 2012-11-01T06:52:59.123 回答