Answered! 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,…

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

 Problems:

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;
}
}

Still stressed from student homework?
Get quality assistance from academic writers!