Nevermind, I wanted to delete this post, but did not want to bother emailing the moderator. Sorry.

Recommended Answers

All 5 Replies

First of all, do not use the line "using namespace std;" (or any other namespace) inside a header file. This is bad. You are not supposed to dump a namespace in a header file (it will make people who use your library (including yourself) very angry in the future).

I don't see a particular reason why your code does not compile. It must be the way you compile it. Now, error messages are usually precise, your description of the error was not. Post the error message to make it clear.

Does the error say: "unresolved external reference to 'ListItr::moveForward'"
or does it say: "class ListItr has no member called 'moveForward'"

In the former case, you have not compiled and linked all the cpp files together. You should have a GCC command line like this:

g++ main.cpp List.cpp ListItr.cpp ListNode.cpp -Wall -o MyProgram

(or have all your cpp files added as "source files" in your project, if you are using an IDE like Visual Studio)

In the latter case, you have forgot to include the ListItr.h in one of the source files that use it (but I doubt that since you are sort-of abusing #includes in your code already).

BTW: if this is not for a school assignment, note that std::list (in #include <list>) is a double linked-list with all the functionality you need, and more (and usable with all the neat stuff in #include <algorithm>).

Mike: it took you over 33 minutes to press the Post Reply button??

LoL... I was doing something else and didn't refresh the page and pressed "post reply".

Well I fixed my original problem, so if Mike is still willing to help, how do I get my isPastEnd() function to work?

ListItr.cpp: In member function ‘bool ListItr::isPastEnd() const’:
ListItr.cpp:23: error: ‘class ListItr’ has no member named ‘tail’
ListItr.cpp: In member function ‘bool ListItr::isPastBeginning() const’:
ListItr.cpp:31: error: ‘tail’ was not declared in this scope
ListItr.cpp:31: error: expected primary-expression before ‘||’ token
ListItr.cpp:31: error: ‘head’ was not declared in this scope
ListItr.cpp:31: error: expected ‘;’ before ‘)’ token

Nevermind, I wanted to delete this post, but did not want to bother emailing the moderator. Sorry.

student@cs2150athome:~/cs2150$ g++ List.cpp ListItr.cpp ListNode.cpp ListTest.cpp
/tmp/ccLP9X5B.o: In function `main':
ListTest.cpp:(.text+0x15b): undefined reference to `List::~List()'
ListTest.cpp:(.text+0x33a): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x430): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x479): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x9c4): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0xb45): undefined reference to `printList(List&, bool)'
/tmp/ccLP9X5B.o:ListTest.cpp:(.text+0xcb7): more undefined references to `printList(List&, bool)' follow
/tmp/ccLP9X5B.o: In function `main':
ListTest.cpp:(.text+0xfc8): undefined reference to `List::~List()'
ListTest.cpp:(.text+0x1051): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x1078): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x109f): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x10c6): undefined reference to `printList(List&, bool)'
ListTest.cpp:(.text+0x10fd): undefined reference to `List::~List()'
collect2: ld returned 1 exit status
#include <iostream>
#include <string>
#include <ctype.h>
#include <stdlib.h>
using namespace std;

//Make sure your own files for the List and ListItr
//classes are included here.  These are the names I used.
#include "List.h"
#include "ListItr.h"


int      menu (string option[], int n_opt);

//set up menu options
string   option[] =   { "Quit",
                        "New List",
                        "Show List elements",
                        "Set ListItr with first()",
                        "Set ListItr with find()",
                        "Move ListItr forward",
                        "Move ListItr backward",
                        "Retrieve element at ListItr",
                        "Insert element before",
                        "Insert element after",
                        "Insert element at tail",
                        "Remove element",
                        "Cardinality (size)",
                        "Copy list w/copy constructor",
                        "Copy list with operator=",
                      };
int      const n_choice = 15 ;

int   main ()
/*
**  This main driver program interactively exercises a
**   list package.
**  It assumes a linked list implementation, and its real
**   purpose is to exercise the underlying list manipulation
**   procedures.
**  It uses a menu to accept commands from the terminal,
**   then performs the indicated command.
*/
{
    int      command;
    string   response;
    List     *list = NULL;
    ListItr  *itr = NULL;
    // Initialize this run
    cout << "--------------------------------------------------\n";
    cout << "\tThis test harness operates with one List\n"
         << "\tobject and one ListItr object.\n\n"
         << "\tUse the menu options to manipulate these\n"
         << "\tobjects.\n";

    while (1) {
        command = menu(option, n_choice);

        switch (command) {
        case 1:                        // Quit
            cout << "\tDo you really want to quit? (y/n) > ";
            cin  >> response;

            if (response[0] == 'y' || response[0] == 'Y') {                 // Normal Exit
                return 0;
            }

            break;

        case 2:                        // New list
            if (list != NULL) delete list;
            list = new List;

            cout << "\tYou have created an empty list\n";
            cout << "\tDo you want to initialize it with elements? (y/n) > ";
            cin  >> response;

            if (response[0] != 'y' && response[0] != 'Y')
                break;
            // accept elements
            cout << "\t\tEnter elements one by one as integers.\n";
            cout << "\t\tAny non-numeric character, e.g. #, ";
            cout << "will terminate input\n";

            cout << "\tEnter first element: ";
            cin >> response;

            while (isdigit(response[0])) {
                int element = atoi(response.c_str());
                list->insertAtTail(element);

                cout << "\tEnter next element: ";
                cin >> response;
            }

            cout << endl << "The elements in forward order: " << endl;
            printList(*list, true);
            break;

        case 3:                      // show elements
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }
            cout << "\tPrint the list forwards or backwards? (f/b) > ";
            cin  >> response;

            if (response[0] == 'b' || response[0] == 'B') {
                cout << endl << "The elements in reverse order:" << endl;
                printList(*list, false);
            } else {
                cout << endl << "The elements in forward order:" << endl;
                printList(*list, true);
            }
            break;

        case 4:                      // test first()
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }
            cout << "\tSetting the ListItr to the first element..." << endl;
            itr = new ListItr((list->first()));
            break;

        case 5:                      // test find()
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }
            cout << "\tEnter element to find: ";
            cin >> response;

            if (isdigit(response[0])) {
                int element = atoi(response.c_str());
                itr = new ListItr((list->find(element)));
                cout << "\tSetting the ListItr to find("
                     << element << ")..." << endl;
            } else {
                cout << "\tPlease enter an integer." << endl;
            }
            break;

        case 6:                      // test moveForwards()
            if (itr == NULL) {
                cout << endl << "\tCreate a ListItr first." << endl;
                break;
            }
            cout << "\tMoving the ListItr forwards..." << endl;
            itr->moveForward();
            break;

        case 7:                      // test move_backwards()
            if (itr == NULL) {
                cout << endl << "\tCreate a ListItr first." << endl;
                break;
            }
            cout << "\tMoving the ListItr backwards..." << endl;
            itr->moveBackward();
            break;

        case 8:                      // test retrieve()
            if (itr == NULL) {
                cout << endl << "\tCreate a ListItr first." << endl;
                break;
            }

            if (itr->isPastBeginning())
                cout << "\tThe ListItr is past the beginning." << endl;
            else if (itr->isPastEnd())
                cout << "\tThe ListItr is past the end." << endl;
            else
                cout << "\tElement retrieved: " << itr->retrieve() << endl;
            break;

        case 9:                        // Insert element before
            if (list == NULL || itr == NULL) {
                cout << endl << "\tCreate a List and ListItr first." << endl;
                break;
            }

            cout << "\tEnter element to insert: ";
            cin >> response;

            if (isdigit(response[0])) {
                int element = atoi(response.c_str());
                list->insertBefore(element, *itr);
                cout << "\tInserting " << element
                     << " before the current ListItr" <<endl;
            } else {
                cout << "\tPlease enter an integer." << endl;
                break;
            }

            cout << endl << "The elements in forward order: " << endl;
            printList(*list, true);
            break;

        case 10:                        // Insert element after
            if (list == NULL || itr == NULL) {
                cout << endl << "\tCreate a List and ListItr first." << endl;
                break;
            }

            cout << "\tEnter element to insert: ";
            cin >> response;

            if (isdigit(response[0])) {
                int element = atoi(response.c_str());
                list->insertAfter(element, *itr);
                cout << "\tInserting " << element
                     << " after the current ListItr" <<endl;
            } else {
                cout << "\tPlease enter an integer." << endl;
                break;
            }

            cout << endl << "The elements in forward order: " << endl;
            printList(*list, true);
            break;

        case 11:                        // Insert element at tail
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }

            cout << "\tEnter element to insert: ";
            cin >> response;

            if (isdigit(response[0])) {
                int element = atoi(response.c_str());
                list->insertAtTail(element);
                cout << "\tInserting " << element
                     << " at the tail of the list" <<endl;
            } else {
                cout << "\tPlease enter an integer." << endl;
                break;
            }

            cout << endl << "The elements in forward order: " << endl;
            printList(*list, true);
            break;

        case 12:                        // Remove element
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }

            cout << "\tEnter element to remove: ";
            cin >> response;

            if (isdigit(response[0])) {
                int element = atoi(response.c_str());
                list->remove(element);
                cout << "\tRemoving " << element
                     << " from list" <<endl;
            } else {
                cout << "\tPlease enter an integer." << endl;
                break;
            }

            cout << endl << "The elements in forward order: " << endl;
            printList(*list, true);
            break;

        case 13:                      // test size()
            if (list == NULL) {
                cout << endl << "\tCreate a List first." << endl;
                break;
            }

            cout << "\tSize of list: " << list->size() << endl;
            break;

        case 14: {
            List* old_list=list;
            list=new List(*old_list);
            old_list->makeEmpty();

            cout << "The new list is (forward ): " ;
            printList(*list, true);
            cout << "The new list is (backward): " ;
            printList(*list, false);
            cout << "The old list was made empty (forward ): ";
            printList(*old_list, true);
            cout << "The old list was made empty (backward): ";
            printList(*old_list, false);
            cout << "The old list should be destroyed now." << endl;
            delete old_list;
            break;
        }
        case 15: {
            List* old_list=list;
            list=new List();
            *list=*old_list;
            old_list->makeEmpty();

            cout << "The new list is (forward ): " ;
            printList(*list,true);
            cout << "The new list is (backward): " ;
            printList(*list,false);
            cout << "The old list was made empty (forward ): " ;
            printList(*old_list,true);
            cout << "The old list was made empty (backward): " ;
            printList(*old_list,false);
            cout << "The old list should be destroyed now." << endl;

            delete old_list;
            break;
        }



        }               // end of switch (command)
    }            // end of while (1)
}     // end of main()

int   menu (string option[], int n_opt)
/*
**  This simple routine takes an array of 'n_opt' options
**  (pointers to strings, describing the 'option')
**  displays these options on the screen,
**  and requests a choice on the part of the user
**  It returns the integer number (position in the list)
**  of the chosen option.
**
**  NOTE, all input and output uses 'stdin' and 'stdout'
*/
{
    int      choice, i;
    string   input;

    cout << "     - - - - - -  MENU - - - - - -\n\n";

    for (i = 0; i < n_opt; ++i)
        cout << "\t" << (i+1) << " - " << option[i] << endl;

    cout << "\n";
    cout << "     - - - - - - - - - - - - - - -\n";

    while (input.empty()) {
        cout << "     Enter number of choice > ";
        cin >> input;

        if (isdigit(input[0])) {
            choice = atoi(input.c_str());

            if (choice <= n_opt && choice > 0) {
                return choice ;
            } else {          /* choice out of range */
                cout << "\tYour response MUST be between 1 and "
                     << n_opt << endl;
                input = "";
            }
        } else {                /* Non-numeric input, ignore */
            cout << "\tYour response MUST be a number!\n";
            input = "";
        }
    }

    return 1;
}          // end of menu()
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.