Home > Net >  Multiple constructors in a C LinkedList class: non-class type "ClassName"
Multiple constructors in a C LinkedList class: non-class type "ClassName"

Time:10-22

I have a LinkedList constructor where I can pass in an array and it builds. Then I can add additional nodes to it by passing in integers.

However, I also want the option to construct the LinkedList, without any arguments. In my LinkedList.h file I've tried to create a constructor that sets the first and last pointers. My add method should construct a Node.

But in my main() function, when I try to use this constructor, I get an error:

request for member ‘add’ in ‘l’, which is of non-class type ‘LinkedList()’

Same error for the other methods called in the main.cpp.

Where am I going wrong in how I structure my two constructors?

main.cpp

#include <iostream>
#include <string>

#include "LinkedList.h"

using namespace std;

int main()
{
   //int A[] {1, 2, 3, 4, 5};
   //LinkedList l(A, 5);

   LinkedList l();

   l.add(8);
   l.add(3);

   cout << l.getCurrentSize()<<endl;
   l.display();

   return 0;
}

LinkedList.h

#ifndef LINKED_LIST_
#define LINKED_LIST_

#include "IList.h"

class LinkedList: public IList
{
   protected:
      struct Node
      {
         int data;
         struct Node *next;
      };

      struct Node *first, *last;

   public:
   //constructor
   LinkedList(){first=nullptr; last=nullptr;}
   LinkedList(int A[], int n);
   
   //destructor
   virtual ~LinkedList();

   //accessors
   void display();

   virtual int getCurrentSize() const;


   virtual bool add(int newEntry);

};
#endif

LinkedList.cpp

#include <iostream>
#include <string>

#include "LinkedList.h"

using namespace std;

//constructor
LinkedList::LinkedList(int A[], int n)
{
   Node *t;
   int i = 0;

   first = new Node;
   first -> data = A[0];
   first -> next = nullptr;
   last = first;

   for(i = 1; i < n; i  ) {
      t = new Node;
      t -> data = A[i];
      t -> next = nullptr;
      last -> next = t;
      last = t;
   }
};

//destructor
LinkedList::~LinkedList()
{
   Node *p = first;
   while (first) {
      first = first -> next;
      delete p;
      p = first;
   }
}

void LinkedList::display()
{
   Node *p = first;

   while(p) {
      cout << p -> data << " ";
      p = p -> next;
   }
   cout <<endl;
}

int LinkedList::getCurrentSize() const
{
   Node *p = first;
   int len = 0;

   while(p) {
      len  ;
      p = p -> next;
   }
   return len;

}

bool LinkedList::add(int newEntry) 
{
   Node *temporary;
   temporary = new Node;
   temporary -> data = newEntry;
   temporary -> next = nullptr;
   
   if (first==nullptr) {
      first = last = temporary;
   } 
   else { 
      last -> next = temporary;
      last = temporary;
   }

   return true;
}

CodePudding user response:

The problem has nothing to do with your constructors themselves.

LinkedList l(); is a declaration of a function named l that takes no arguments, and returns a LinkedList. That is why the compiler is complaining about l being a non-class type.

To default-construct a variable named l of type LinkedList, drop the parenthesis:

LinkedList l;

Or, in C 11 and later, you can use curly-braces instead:

LinkedList l{};
  • Related