简体   繁体   中英

C++ Simple LinkedList out of scope variables

I am trying to create a LinkedList that takes user information and stores it into its nodes. After which it will display the user information. I have already worked trough this and this is what I have:

    #include <iostream>
    using namespace std;

    template <typename T>
    class Node
    {
    T data;
    Node* next;
};

template <typename T>
class LinkedList

{
    public:
    //Default constructor
    LinkedList(){
        head = NULL;
        tail = NULL;
    }

    void addData(T val){
        Node* newNode = new Node;
        newNode->data = val;
        newNode->next = NULL; // we add newNode at end of linked list
        if( head == NULL){
            head = newNode;
            tail = newNode;
        }

        else{
            tail ->next = newNode;
            tail = newNode;
        }
    }

    void printData() {
        for(Node* i = head; i!=NULL; i = i -> next){
            cout << i->data << " " ; 

        }
    }

    private:
    //Declare the head and tail of the LinkedList
        Node* head;
        Node* tail;

};

int main(){

    LinkedList<string> usrInput;
    cout << "Enter a number or word : ";
    string input ;
    cin >> input;

    usrInput.addData(input);
    usrInput.printData();



    LinkedList<int> numbers;
    while (true)
    {
        cout<< "Enter a number (-1 to stop): ";
        int num;
        cin >> num;

        if (num == -1)
            break;

        numbers.addData(num);
    }
    numbers.printData();


}

The problem is that when I compile my program, I get a bunch of errors referring to out of scope member variables. Are the member variables not suppose to be private?


This is what I have for the debugger:

46:9: error: invalid use of template-name 'Node' without an argument list

47:9: error: invalid use of template-name 'Node' without an argument list

 In constructor 'LinkedList<T>::LinkedList()':

18:9: error: 'head' was not declared in this scope

19:9: error: 'tail' was not declared in this scope

 In member function 'void LinkedList<T>::addData(T)':

23:13: error: missing template arguments before '*' token

23:15: error: 'newNode' was not declared in this scope

23:29: error: invalid use of template-name 'Node' without an argument list

26:13: error: 'head' was not declared in this scope

28:13: error: 'tail' was not declared in this scope

32:13: error: 'tail' was not declared in this scope

 In member function 'void LinkedList<T>::printData()':

38:17: error: missing template arguments before '*' token

38:19: error: 'i' was not declared in this scope

38:23: error: 'head' was not declared in this scope

The data members of a class are private by default. They are public by default on structs. That is, in:

class Node
    {
    T data;
    Node* next;
};

The LinkedList class has no visibility into the Node's members. Try either using:

struct Node {
    T data;
    Node* next;
};

or

class Node {
  public:
      T data;
      Node* next;
};

Stylistically, most real implementations nest the Node as a private member struct inside the LinkedList class.

Node alone does not refer to a valid type in your code. You need to use Node<T> .

When the compiler encounters Node it flags it as an illegal use and discards the variable or member being defined with that type, causing additional errors later in the compile when you use the variable or member.

Once you switch to use a complete type with Node<T> you will then run into the issue mentioned in the other answer with private membership of the members of the Node<T> class.

i hope my answer will be helpull for other people too, even if i'm late haha :) :

   #include <iostream>
   using namespace std;

 template <typename Type>
 class Node
{     
   template<typename T> friend class LinkedList;/* you need to make your linkedList 
        class a friend variable to be able to,acces the private members directly from the objects inside the class Linkedlist.
        other option its to make them public, but it is not recomended and other option si to make functions to acces de data, but this will be very messy, just make your linkedlist class friend*/
   Type data;
   Node<Type>* next; // you need to specify which data type the node will be
};

 template <typename T>
 class LinkedList
{
 public:
//Default constructor
LinkedList(){
    head = NULL;
    tail = NULL;
}

 void addData(T val){
    // you can't forget to specify the data type since it is a    template!!
    Node<T>* newNode = new Node<T>();
    newNode->data = val;
    newNode->next = NULL; // we add newNode at end of linked list
    if( head == NULL){
        head = newNode;
        tail = newNode;
    }

    else{
        tail ->next = newNode;
        tail = newNode;
    }
 }

 void printData() {
    // again specify the data type of the template
    for(Node<T>* i = head; i !=NULL; i = i -> next){
        cout << i->data << "\n" ;

    }
}

private:
    //Declare the head and tail of the LinkedList
    Node<T>* head;// Again specify the data type of the template
    Node<T>* tail;// here the same thing

};

int main(){

   LinkedList<string> usrInput;
   cout << "Enter a number or word : ";
   string input ;
   getline(cin,input);// use the get line function to get strings from standar input

   usrInput.addData(input);
   usrInput.printData();

   // Declare the num variable otuside and initialize it, you should always initialize the variables
   int num(0);
   LinkedList<int> numbers;
   while (true)
  {
       cout<< "Enter a number (-1 to stop): ";
      // you need to validate the input if you don't want to run an infinite loop
       if(!(cin >> num)){
           cin.clear();
           cin.ignore(100,'\n');
        }
        else {
        // if we succes with the imput you can add the data to the linked list :)
           if (num == -1){break;}
           numbers.addData(num);
        }
   }
      numbers.printData();


  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM