Can someone help me fix these errors in the C++ code?
I am getting a jump to case label [-fpermissive] when the switch statements begin, a crosses initialization of ‘Person person’ error,cannot convert ‘std::vector<Person>::iterator {aka __gnu_cxx::__normal_iterator<Person*, std::vector<Person> >}’ to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’
main.cpp
#include <iostream>
#include<vector>
#include<fstream>
using namespace std;
#include “Person.h”
int menu();
int find(vector<Person>, string);
//function to update the data to file every time
void writeToFile(ofstream& , vector<Person>);
int main() {
// Container for holding all Person objects.
vector<Person> people;
ofstream out(“information.txt”);
while(true)
{
int choice = menu();
PersonDetails p;
string name;
int index;
switch(choice)
{
case 1:
cout<<“Enter name: “;
cin>>p.name;
cout<<“nEnter phone: “;
cin>>p.phone;
cout<<“nEnter address: “;
cin>>p.address;
cout<<“nEnter email: “;
cin>>p.email;
cout<<“nEnter website: “;
cin>>p.website;
Person person(p);
people.push_back(person);
writeToFile(out, people);
break;
case 2:
cout<<“nEnter name to search: “;
cin>>name;
index = find(people, name);
if(index<0)
cout<<“nPerson not foundn”;
else
cout<<endl<<people[index];
break;
case 3:
cout<<“nEnter name to remove: “;
cin>>name;
index = find(people, name);
if(index<0)
cout<<“nPerson not foundn”;
else
people.erase(remove(people.begin(), people.end(), index), people.end());
writeToFile(out, people);
break;
case 4:
exit(0);
}
}
return 0;
}
int menu() {
int choice;
//add a person to the text file where names/addresses/etc. are stored
cout << “1. Add Person” << endl;
//search the text file for a name and it will return all of the person’s info
cout << “2. Search Directory” << endl;
//removes a person’s entry from the text file along with all of their personal data
cout << “3. Remove Person” << endl;
//exits from the program
cout << “4. Exit” << endl;
cout<<“nEnter your choice: “;
cin>>choice;
return choice;
}
// Finds a person and returns it index.
int find(vector<Person> pv1, string name)
{
for (unsigned int i = 0; i < pv1.size(); ++i)
{
if (pv1.at(i).get_name() == name)
{
return i;
}
}
return -1;
}
void writeToFile(ofstream& out, vector<Person> people)
{
for(int i=0; i<people.size(); i++)
{
out<<people[i].name<<” “<<people[i].phone<<” “<<people[i].address<<” “<<people[i].email;
out<<” “<<people[i].website<<endl;
}
}
Person.h
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
using namespace std;
struct PersonDetails
{
string name, phone, address, email, website;
};
class Person
{
private:
string _name;
string _phone;
string _address;
string _email;
string _website;
public:
Person();
Person(PersonDetails p1);
virtual ~Person();
string get_name();
friend ostream & operator << (ostream &, Person &);
};
#endif /* PERSON_H_ */
Person.cpp
#include “Person.h”
#include <iostream>
Person::Person()
{
// Init all
_name = “”;
_phone = “”;
_address = “”;
_email = “”;
_website = “”;
}
Person::Person(PersonDetails pd1)
{
_name = pd1.name;
_phone = pd1.phone;
_address = pd1.address;
_email = pd1.email;
_website = pd1.website;
}
Person::~Person()
{}
string Person::get_name()
{
return this->_name;
}
ostream & operator << (ostream &os, Person &p1)
{
os << p1._name;
return os;
}
Expert Answer
1) getting cross initialization error :
resolve it by taking a pointer to the class before the switch starts and instantiate inside switch when needed.
Also pass argument of person class as pointer in vector .
eg:
vector<Person*> people; //change1
ofstream out(“information.txt”);
while(true)
{
int choice = menu();
PersonDetails p;
Person *person; //// change 2
string name;
int index;
switch(choice)
{
case 1:
cout<<“Enter name: “;
cin>>p.name;
cout<<“nEnter phone: “;
cin>>p.phone;
cout<<“nEnter address: “;
cin>>p.address;
cout<<“nEnter email: “;
cin>>p.email;
cout<<“nEnter website: “;
cin>>p.website;
person = new Person(p); //change3
people.push_back(person);
writeToFile(out, people);
2) std::remove error.
Direct use the index received to remove the object from vector
eg : people.erase(people.begin() + index);
3) In function ” void writeToFile(ofstream& out, vector<Person* > people) ”
people[i] is giving you reference to the class object you stored in vector.
so to print use : out<<people[i]->_name<<” “;
but here your “_name” variable is private.
so instead of making it public, make another function in class to directly print all the details.
#Resolved
Additional mistakes ;
-> search directory case have error as you are printing the reference of object not the details.
i’m sharing screenshots also :
CODE is as follows :
Person.h :
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
using namespace std;
struct PersonDetails
{
string name, phone, address, email, website;
};
class Person
{
public:
string _name;
string _phone;
string _address;
string _email;
string _website;
Person();
Person(PersonDetails p1);
virtual ~Person();
string get_name();
friend ostream & operator << (ostream &, Person &);
};
#endif /* PERSON_H_ */
Person.cpp :
#include “Person.h”
#include <iostream>
Person::Person()
{
// Init all
_name = “”;
_phone = “”;
_address = “”;
_email = “”;
_website = “”;
}
Person::Person(PersonDetails pd1)
{
_name = pd1.name;
_phone = pd1.phone;
_address = pd1.address;
_email = pd1.email;
_website = pd1.website;
}
Person::~Person()
{}
string Person::get_name()
{
return this->_name;
}
ostream & operator << (ostream &os, Person &p1)
{
os << p1._name;
return os;
}
Main.cpp :
#include <iostream>
#include <stdlib.h>
#include<vector>
#include<fstream>
using namespace std;
#include “Person.h”
int menu();
int find(vector<Person*>, string);
//function to update the data to file every time
void writeToFile(ofstream& , vector<Person*>);
int main() {
// Container for holding all Person objects.
vector<Person*> people;
ofstream out(“information.txt”);
while(true)
{
int choice = menu();
PersonDetails p;
Person *person;
string name;
int index;
switch(choice)
{
case 1:
cout<<“Enter name: “;
cin>>p.name;
cout<<“nEnter phone: “;
cin>>p.phone;
cout<<“nEnter address: “;
cin>>p.address;
cout<<“nEnter email: “;
cin>>p.email;
cout<<“nEnter website: “;
cin>>p.website;
person = new Person(p);
people.push_back(person);
writeToFile(out, people);
break;
case 2:
cout<<“nEnter name to search: “;
cin>>name;
index = find(people, name);
if(index<0)
cout<<“nPerson not foundn”;
else
cout<<endl<<people[index];
break;
case 3:
cout<<“nEnter name to remove: “;
cin>>name;
index = find(people, name);
if(index<0)
cout<<“nPerson not foundn”;
else
people.erase(people.begin() + index);
writeToFile(out, people);
break;
case 4:
exit(0);
}
}
return 0;
}
int menu() {
int choice;
//add a person to the text file where names/addresses/etc. are stored
cout << “1. Add Person” << endl;
//search the text file for a name and it will return all of the person’s info
cout << “2. Search Directory” << endl;
//removes a person’s entry from the text file along with all of their personal data
cout << “3. Remove Person” << endl;
//exits from the program
cout << “4. Exit” << endl;
cout<<“nEnter your choice: “;
cin>>choice;
return choice;
}
// Finds a person and returns it index.
int find(vector<Person* > pv1, string name)
{
for (unsigned int i = 0; i < pv1.size(); ++i)
{
if (pv1.at(i)->get_name() == name)
{
return i;
}
}
return -1;
}
void writeToFile(ofstream& out, vector<Person* > people)
{
for(int i=0; i<people.size(); i++)
{
out<<people[i]->_name<<” “<<people[i]->_phone<<” “<<people[i]->_address<<” “<<people[i]->_email;
out<<” “<<people[i]->_website<<endl;
}
}