Why am i getting these errors with my compiler for this code? C++ RolodexEntryMa
ID: 3886926 • Letter: W
Question
Why am i getting these errors with my compiler for this code? C++
RolodexEntryManager.cpp
-------------------------------------
#include <iostream>
#include "RolodexEntry.h"
#include <vector>
#include <climits>
#include <cctype>
using namespace std;
//function dec
void printMainMenu();
void printEditMenu(vector<RolodexEntry> & list);
void editContactSub(const short c, vector<RolodexEntry> & list);
void printSearchMenu(vector<RolodexEntry> & list);
void printList(vector<RolodexEntry> & list);
void eraseEntry(vector<RolodexEntry> & list, short index);
int main(void)
{
bool isRunning = true;
vector<RolodexEntry> list;
do
{
char c;
printMainMenu();
cin >> c;
cin.ignore(INT_MAX, ' ');
switch(tolower(c))
{
case '1': case 'a':
{
RolodexEntry newEntry;
newEntry.readIn();
list.push_back(newEntry);
break;
}
case '2': case 'e':
{
printEditMenu(list);
break;
}
case '3': case 'd':
{
printList(list);
cout << " Select Contact to delete:";
if(cin.fail())
{
cin.clear();
cin.ignore();
}
short c;
cin >> c;
eraseEntry(list, c-1);//resizes and moves back
break;
}
case '4': case 's':
{
printSearchMenu(list);
break;
}
case '5': case 'p':
{
printList(list);
break;
}
case '6': case 'q':
{
isRunning = false;
break;
}
default:
{
cout << "Invalid selection.";
break;
}
}
}while(isRunning);
return 0;
}
void printMainMenu()
{
cout << " Main Menu "
<< "1. Add contact "
<< "2. Edit contact "
<< "3. Delete contact "
<< "4. Search contacts "
<< "5. Print all contacts "
<< "6. Quit ";
return;
}
void printEditMenu(vector<RolodexEntry> & list)
{
cout << " ";
printList(list);
cout << " Select Contact to edit:";//read in choice
if(cin.fail())
{
cin.clear();
cin.ignore();
}
short c;
cin >> c;
cin.ignore(INT_MAX, ' ');
editContactSub(c, list);
return;
}
void editContactSub(const short c, vector<RolodexEntry> & list)//and work
{
short index = c;
if(index >= 0 && index < list.size())//it's gooooood!
{
RolodexEntry edited = list[static_cast<short>(c)-1];
//edit menu
cout << "1. edit First name "
<< "2. edit Last name "
<< "3. edit Address "
<< "4. edit Phone number "
<< "5. edit Email ";
char sel;
cin >> sel;
cin.ignore(INT_MAX, ' ');
switch(tolower(sel))
{
case '1': case 'f':
{
cout << " Enter new first name: ";
string newName;
cin >> newName;
edited.setFName(newName);
break;
}
case '2': case 'l':
{
cout << " Enter new last name: ";
string newName;
cin >> newName;
edited.setLName(newName);
break;
}
case '3': case 'a':
{
cout << " Enter new street number and street: ";
string newStreet;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newStreet);
edited.setStreet(newStreet);
cout << " Enter new town: ";
string newtown;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newtown);
edited.setTown(newtown);
cout << " Enter new state: ";
string newstate;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newstate);
edited.setState(newstate);
cout << " Enter new zipcode: ";
long newzip;
cin >> newzip;
if(newzip > 99999)//long zip
{
edited.setZip(newzip);
edited.setSZipLong();//finds szip from long zip
}
else
{
edited.setSZip(newzip);
}
break;
}
case '4': case 'p':
{
cout << " Enter new areacode: ";
short newarea;
cin >> newarea;
edited.setArea(newarea);
cout << " Enter new exchange number: ";
short newex;
cin >> newex;
edited.setExchange(newex);
cout << " Enter new line: ";
short newLine;
cin >> newLine;
edited.setPLine(newLine);
break;
}
case '5': case 'e':
{
cout << " Enter new email: ";
string newemail;
cin >> newemail;
edited.setEmail(newemail);
break;
}
}
}
else
{
cout << "Contact at this index does not exist.";
}
return;
}
void printSearchMenu(vector<RolodexEntry> & list)//and work
{
cout << "1. search by Name "
<< "2. search by Address "
<< "3. search by Phone number "
<< "4. search by Email "
<< "5. Return to Main menu ";
char c;
cin >> c;
cin.ignore(INT_MAX, ' ');
switch(tolower(c))
{
case '1': case 'n':
{
cout << " Enter search term: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getFName().find(search) != string::npos ||
list[i].getLName().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '2': case 'a':
{
cout << " Enter search term: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getStreet().find(search) != string::npos ||
list[i].getTown().find(search) != string::npos ||
list[i].getState().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '3': case 'p':
{
cout << " Enter part of phone number (last four digits gives best results): ";
short search;
while(cin.fail())
{
cin.clear();
cin.ignore();
}
cin >> search;
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getArea() == search || list[i].getExchange() == search ||
list[i].getPLine() == search)
{
list[i].printEntry();
}
}
break;
}
case '4': case 'e':
{
cout << " Enter email: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getEmail().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '5': case 'q':
{
break;
}
default:
{
cout << " Invalid seletion.";
break;
}
}
}
void printList(vector<RolodexEntry> & list)
{
cout << ' ';
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
cout << i+1 << ".";
list[i].printEntry();
}
return;
}
void eraseEntry(vector<RolodexEntry> & list, short index) {
vector<RolodexEntry>::size_type pos = index - 1;
vector<RolodexEntry>::size_type k;
if (pos < list.size() && pos >= 0) {
for (k = pos + 1; k != list.size(); k++) {
list[k - 1] = list[k];
}
list.pop_back();
} else {
cout << "Out of bounds.";
}
return;
}
-----------------------------------------------------------------
RolodexEntry.cpp
------------------------------
#include "RolodexEntry.h"
#include <iostream>
using namespace std;
void RolodexEntry::printEntry()
{
cout << " Name: " << fName << " " << lName;
cout << " Address: " << street <<
" " << town << ", " <<
state << ' ';
if(zip != 0)
{
cout << zip;
}
else
{
cout << szip;
}
cout << " Phone: (" << area << ')' << exchange << '-' << line << " ";
}
void RolodexEntry::readIn()
{
cout << " Enter new contact's first name: ";
cin >> fName;
cout << " Enter new contacts's last name: ";
cin >> lName;
cout << " Enter new contacts's address (number and street): ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, street);
cout << " Enter new contacts's town: ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, town);
cout << " Enter new contacts's state: ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, state);
cout << " Enter new contacts's zipcode: ";
long tempZip;
cin >> tempZip;
if(tempZip > 99999)//long zip
{
zip = tempZip;
setSZipLong();//finds szip from long zip
}
else
{
szip = tempZip;
}
cout << " Enter new contacts's phone number (separated by spaces): ";
cin >> area >> exchange >> line;
cout << " Enter new contacts's email: ";
cin >> email;
}
----------------------------------------------------------------------
RolodexEntry.h
-----------------------------------------
#ifndef ROLODEXENTRY_H_INCLUDED
#define ROLODEXENTRY_H_INCLUDED
#include <string>
//using namespace std;
//base project only
class RolodexEntry
{
private:
std::string fName, lName, street, town, state;
long zip;
short szip, area, exchange, line;
std::string email;
public:
RolodexEntry(void):fName(), lName(), street(), town(),
state(), zip(000000000), szip(00000),
area(0), exchange(0), line(0), email() {}
RolodexEntry(std::string fname, std::string lname):street(), town(),
state(""), zip(000000000),
szip(00000), area(0),
exchange(0), line(0), email() {}
RolodexEntry(const RolodexEntry & r):fName(r.fName), lName(r.lName),
street(r.street), town(r.town),
state(r.state), zip(r.zip), szip(r.szip),
area(r.area), exchange(r.exchange),
line(r.line), email(r.email) {}
std::string getFName() const {return fName;}
void setFName(std::string first){fName = first;}
std::string getLName() const {return lName;}
void setLName(std::string last){lName = last;}
std::string getStreet() const{return street;}
void setStreet(std::string str){street = str;}
std::string getTown() const {return town;}
void setTown(std::string newtown){town = newtown;}
std::string getState() const {return state;}
void setState(std::string newstate){state = newstate;}
long getZip() const {return zip;}
void setZip(long newzip){zip = newzip;}
short getSZip() const {return szip;}
void setSZipLong(){szip = zip / 10000;}
void setSZip(short newszip){szip = newszip;}
short getArea() const {return area;}
void setArea(short newarea){area = newarea;}
short getExchange() const {return exchange;}
void setExchange(short exch){exchange = exch;}
short getPLine() const {return line;}
void setPLine(short newline){line = newline;}
std::string getEmail(){return email;}
void setEmail(std::string Email){email = Email;}
void printEntry();//other fns
void readIn();
bool isEqual(RolodexEntry e){return e.fName == fName && e.lName == lName &&
e.street == street && e.town == town &&
e.state == state && e.zip == zip && e.szip == szip &&
e.area == area && e.exchange == exchange && e.line == line &&
e.email == email;}
};
#endif // ROLODEXENTRY_H_INCLUDED
Explanation / Answer
Undefined reference means that whilst the compiler understands how the function should work (which means it understands the name of the function, the input types and the return type), the linker cannot find the actual compiled code that actually does the work.
In this case, if you #include <RolodexEntry.h> in your code, the compiler will then find the function prototype, and from that will know the name and parameters. Good so far. Then, everywhere you use the actual function, the compiler effectively leaves a note to the linker, saying "here, you put in the compiled code that actually makes this function call work".
So, then the linker comes along. The compiler has presented it with some compiled code (but NOT the compiled version of RolodexEntry.cpp, because you have not compiled that, or if you have, you have not told the linker where to find it). The linker then goes looking for the compiled function. It does not find it. It comes back and says "undefined reference". You fix this by compiling RolodexEntry.cpp and making sure the linker can find it.
Under g++, this would be done simply:
g++ RolodexEntryManager.cpp RolodexEntry.cpp to build
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.