Nevermind, I wanted to delete this post, but did not want to bother emailing the moderator. Sorry.
mike_2000_17 2,669 21st Century Viking Team Colleague Featured Poster
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>).
Edited by mike_2000_17 because: n/a
Ancient Dragon 5,243 Achieved Level 70 Team Colleague Featured Poster
Mike: it took you over 33 minutes to press the Post Reply button??
mike_2000_17 2,669 21st Century Viking Team Colleague Featured Poster
LoL... I was doing something else and didn't refresh the page and pressed "post reply".
QuesoTaco 0 Newbie Poster
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
QuesoTaco 0 Newbie Poster
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()
Edited by peter_budo because: Keep It Clear - Do wrap your programming code blocks within [code] ... [/code] tags
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.