2012-11-01 4 views
0

Je travaille sur une affectation où l'on me demande d'implémenter une liste chaînée en C++. Jusqu'à présent, tout fonctionne bien, sauf quand je crée une nouvelle liste. dans ma méthode create_list(). après avoir attribuer le contenu et un numéro d'identification à mon Field et essayer d'appeler GetNext() j'obtiens une erreur en disant: Request for member 'GetNext()' in 'Node' which is a non-class type '*Field'. Je suis encore nouveau à la syntaxe C++ et la programmation orientée objet. Qu'est-ce que je fais mal? Je pensais en utilisant la ligne Field *Node = new Field(SIZE, EMPTY); que ma variable Node serait du type de classe Field ...?Implémentation de la liste chaînée C++

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

ici est ma méthode 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; 
    } 
} 

Répondre

1

Non dans la déclaration

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

nœud est de pointeur de type au champ.

La correction est simple si vous avez un pointeur vers une classe et que vous souhaitez accéder à un membre de cette classe, utilisez ->.

Node->GetNext() = Gameboard; 

Je pense que votre code a d'autres erreurs, et je ne pense pas que même avec cette « solution », il va travailler. Probablement ce que vous voulez vraiment est

Node->SetNext(Gameboard); 
+0

génial merci .... qui fait plus de sens maintenant que je pense à ce sujet .... – accraze

1

Vous appelez Node.GetNext(), mais Node est un pointeur. Vous devez utiliser l'opérateur -> au lieu de l'opérateur ., comme dans Node->GetNext().

+0

essayé cela, mais maintenant je reçois cette erreur: « lvalue nécessaire comme opérande gauche d'affectation » – accraze

+0

@ SunHypnotic voir ma réponse. – john

3

. est utilisé pour adresser des membres dans des objets et des références à des objets. Node, cependant, est un pointeur vers un objet. Vous devez donc le transformer en référence avant de pouvoir l'utiliser avec .. Cela signifie faire (*Node).GetNext(). Ou vous pouvez utiliser la sténographie: Node->GetNext() - ces deux sont exactement équivalents.

Un bon mnémotechnique à utiliser est que vous utilisez l'opérateur avec des pointeurs :) Pointy

0

Le moût de fonction retourne une valeur de référence si vous souhaitez définir comme valeur l. Code Vous avez besoin des changements:

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

vous pouvez utiliser la fonction comme lvalue

Node->GetNext() = *Gameboard; 
Questions connexes