2017-08-28 1 views
-3

J'essaye de créer une liste liée à l'inventaire où l'utilisateur peut ajouter un produit (identification, information, prix, compte) et ensuite stocker l'objet dans une liste liée. Le problème que j'ai est avec la classe de noeud donnant l'erreur "spécificateur de type manquant - int supposé Note: C++ ne supporte pas default-int" et ainsi de suite pour chaque déclaration dans la classe de noeud.Objet dans la liste chaînée de nœuds

#ifndef INVENTORY_H 
#define INVENTORY_H 

#include<iostream> 
#include <string>  
#include <iomanip> 
using namespace std; 

class Node 
{ 
public: 
    Node(){} 
    Node(const Inventory& theData, Node *theLink) 
     : data(theData), link(theLink){} 
    Node* getLink() const { return link; } 
    Inventory getData() const { return data; } 
    void setData(const Inventory& theData) 
    { 
     data = theData; 
    } 
    void setLink(Node *theLink) { link = theLink; } 
private: 
    Inventory data; 
    Node *link;  //pointer that points to next node 
}; 

class Inventory 
{ 
public: 
    Inventory(); 
    void addPart(int, string, int, int); 
    void findPart(int); 
    void toBinary(); 
    void quit(); 
private: 
    int id; 
    int price; 
    string partInfo; 
    int partCount; 

    Node* first; 
    Node* last; 
    int count; 
}; 
#endif 

Et les erreurs sont:

1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(13): error C2143: syntax error : missing ',' before '&' 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(16): error C2146: syntax error : missing ';' before identifier 'getData' 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(16): warning C4183: 'getData': missing return type; assumed to be a member function returning 'int' 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(17): error C2143: syntax error : missing ',' before '&' 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(23): error C2146: syntax error : missing ';' before identifier 'data' 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(13): error C2065: 'Thedata' : undeclared identifier 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(13): error C2065: 'theLink' : undeclared identifier 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(13): error C2614: 'Node' : illegal member initialization: 'data' is not a base or member 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(16): error C2065: 'data' : undeclared identifier 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(19): error C2065: 'data' : undeclared identifier 
1>c:\users\jeffrey\desktop\epp_fall\epp_fall\inventory.h(19): error C2065: 'theData' : undeclared identifier 
+0

Quel est le problème avec simplement utiliser 'std :: list' ou' std :: vector'? Pourquoi réinventer la roue? –

Répondre

1

Vous regardez simplement un cas standard du compilateur ne sachant pas ce que sont vos types personnalisés en raison de l'ordre que vous les avez définis. Même si vous transférez une classe (mettez "class Inventory;" quelque part au-dessus), vous ne pouvez pas l'utiliser pour certaines choses. Déclarer une variable membre qui n'est pas un pointeur en fait partie. Cependant, si vous inversez les définitions (Inventaire avant nœud) et renvoyez le nœud de la classe ("nœud de classe"), votre code sera compilé car vous n'avez que le nœud * dans votre classe d'inventaire.

Cocher cette réponse pour plus de détails: https://stackoverflow.com/a/553869/128581

Comme l'a souligné, ce n'est pas la meilleure conception si ce code n'est pas strictement pour l'apprentissage. Les conteneurs STL couvrent les structures de données les plus courantes (les listes à double liaison et les listes à liens simples en sont deux). stl :: list et stl :: forward_list respectivement.

0

Le compilateur C++ lit le code source de haut en bas. Quand il arrive à la ligne 13, il n'a pas entendu parler d'un type Inventory. Il pense que Inventory doit donc être le nom du paramètre, et devient vraiment confus.

La solution est de changer l'ordre des Node et Inventory les classes, et de pré-déclarer la classe Node avant le début de la classe Inventory, en insérant la ligne suivante

class Node; 

avant la début de class Inventory.

Changement de l'ordre a Inventory défini avant Node, ce qui est important parce que le compilateur a besoin de tout savoir sur un Inventory pour construire un Node, puisque Node s contiennent Inventory s. La ligne supplémentaire indique au compilateur qu'il existe une classe Node, mais not anything about what it is; De cette façon, vous pouvez utiliser des pointeurs vers Node s (ou toute autre chose qui ne nécessite pas connaître la disposition d'un Node), mais ne peut rien faire d'autre avec eux jusqu'à ce qu'ils soient complètement définis. Depuis Inventory utilise seulement des pointeurs, cela ne devrait pas être un problème.


Cependant, comme décrit, je ne vois pas pourquoi Inventory a besoin des pointeurs de nœud à tous; Il semble que votre classe Inventory soit ce que vous avez appelé un produit dans votre description en anglais, et un produit ne devrait pas avoir besoin de connaître le reste des données. Vous pouvez également utiliser std::forward_list au lieu d'essayer d'implémenter votre propre type de liste liée.