每当我尝试初始化Employer对象时,我的程序都会给出一个未处理的异常错误
My program gives an Unhandled exception error whenever I try to initialize a Employer object
我试图使用emp2指针初始化Employer对象,但我一直得到一个错误:
empPract.exe中0x008d2c6b处未处理的异常:0xC0000005:访问读取位置0xcdcdcde5时发生冲突。
我试着通过遍历代码并在线查找错误代码来查找错误。我如何识别和纠正问题?
这是代码:
主驱动程序:
#include "Employer.h"
#include <string>
#include <iostream>
using namespace std;
void main(){
Employer *emp2;
emp2=new Employer();// this is where i tried to initialize the employer
cout <<"Employer id:" << emp2->getUniqueId() << endl;
system("PAUSE");
}// end main
雇主类别:
#ifndef EMPLOYER_H
#define EMPLOYER_H
#include <time.h>
#include <iostream>
#include "JobSeeker.h"
#include <string>
#include "Address.h"
//#define MAX 1000;
using namespace std;
class Employer{
private:
int empID;
string companyName; // addresss of the company
Address *empAddress;
string compTelephone;
string areaOfEmployment;
//Person *manager;
string contactName;
string contactTitle;
int maxRecruits; // number of employees needed
int totalRecruited;
int totalPlaced;
// links
Employer *next;
public:
Employer(){
empID=0;
companyName=" ";
compTelephone=" ";
areaOfEmployment=" ";
contactName=" ";
contactTitle=" ";
maxRecruits=0;
totalRecruited=0;
totalPlaced=0;
empAddress->setStreet(" ");
empAddress->setStreetNum(" ");
empAddress->setParish(" ");
// set links
next=NULL;
}// default constructor
Employer(int id, string cname, Address *usrAdd, string telephone, string nameOfContact, string contTitle, string aoe ){
empID=id;
companyName=cname;
compTelephone= telephone;
contactName=nameOfContact;
contactTitle=contTitle;
areaOfEmployment=aoe;
empAddress->setStreet(usrAdd->getStreet());
empAddress->setStreetNum(usrAdd->getStreetNum());
empAddress->setParish(usrAdd->getParish());
// set links
next=NULL;
}// Primary Constructor */
//copy constructor
Employer(Employer *emp1){
empID=emp1->getUniqueId();
companyName=emp1->getCompanyName();
compTelephone=emp1->getCompTelephone();
contactName=emp1->getContactName();
contactTitle=emp1->getContactTitle();
areaOfEmployment=emp1->getAOE();
empAddress=emp1->getAddress();
next=NULL;
}// copy constructor
//destructor
Employer::~Employer(){
delete empAddress;
delete next;
}// destructor
void setEmpID(){
// srand(5);
// EmpID = rand()%MAX+1;
}// set id
int getUniqueId(){
return empID;
}// end of getter for EmpID
void setCompanyName(string cname){
companyName=cname;
}// end of setter for company name
string getCompanyName(){
return companyName;
}// end of function to return companyName
void setCompTelephone(string cTele){
compTelephone=cTele;
}// end of setter for company's telephone number
string getCompTelephone(){
return compTelephone;
}// end of getter for company telephone number
void setContactName(string cName){
contactName=cName;
}// end of setContactName
string getContactName(){
return contactName;
}// end of getter for contactName
void setContactTitle(string title){
contactTitle=title;
}// end of setter for contactTitle
string getContactTitle(){
return contactTitle;
}// end of getter for contactTitle
void setMaxRecruits(int max){
maxRecruits=max;
} // end of setter for maxRecruits
int getMaxRecruits(){
return maxRecruits;
}// end of getter for maxRecruits
void setAreaOfEmployment( string aoe){
areaOfEmployment=aoe;
}// end of setter for aoe
string getAOE(){
return areaOfEmployment;
}// end of getter for areaOfEmployment
// set links
void setNext(Employer *nx){
next=nx;
}// end mutator for setNexEmp
void setAddress(string street, string streetNumber, string par){
empAddress->setStreet(street);
empAddress->setStreetNum(streetNumber);
empAddress->setParish(par);
}// end of setter for employer address
Address * getAddress(){
return empAddress;
}// end of getter for address
// set links
Employer *getNext(){
return next;
}// end of getter for nextEmployer
};
#endif
求职者类别:
#ifndef JOBSEEKER_H
#define JOBSEEKER_H
#include <string>
#include "Address.h"
#include "Person.h"
#include <time.h>
#include "Date.h"
using namespace std;
class JobSeeker:public Person{
private:
string middlename;
string gender;
string TRN;
string NIS;
Person *reference[2];
Date *dob;
string AreaOfInt;
string recruitmentStatus;
string companyPlaced;
time_t lastSelectedDate; // date the JobSeeker was last recruited/ placed
time_t dateOfRegistration; // date the job seekeer registered
Address *jSeekerAddress;
// links
JobSeeker *next;
public:
JobSeeker(){
int i;
next=NULL;
dob=NULL;
middlename="";
firstname="";
lastname="";
TRN="";
NIS="";
gender="";
wrkNum="";
cellNum="";
homeNum="";
for (i=0; i<2;i++){
reference[i]->setFirstName("");
reference[i]->setLastname("");
reference[i]->setCellNum("");
reference[i]->setHomeNum("");
reference[i]->setWrkNum("");
Address *temp=new Address();
reference[i]->setAddress(temp);
}// end for loop
AreaOfInt="";
recruitmentStatus="";
companyPlaced="";
lastSelectedDate=time(0); // last selected date for job seeker
dateOfRegistration=time(0); // date the job seeker registered
jSeekerAddress->setStreet("");
jSeekerAddress->setStreetNum("");
jSeekerAddress->setParish("");
}// end of default constructor for job seeker
JobSeeker(JobSeeker *js){
int i;
firstname= js->getFirstname();
middlename=js->getMiddlename();
lastname=js->getLastname();
dob=js->getDOB();
TRN=js->getUniqueId();
NIS=js->getNIS();
gender=js->getGender();
wrkNum=js->getWrkNum();
cellNum= js->getCellNum();
homeNum=js->getHomeNum();
reference[i]= js->getReference1();
reference[i]=js->getReference2();
//reference[i]->
lastSelectedDate=js->getSelectedDate();
dateOfRegistration=js->getDateOFReg();
AreaOfInt=js->getAreaOFInt();
recruitmentStatus=js->getRecruitStatus();
companyPlaced=js->getCompanyPlaced();
// set link to next jobseeker
next=js->getNext();
}// copy constructor
// destructor
JobSeeker::~JobSeeker(){
delete next;
delete dob;
delete reference[0]; reference[1];
delete jSeekerAddress;
}// destructor
void setMiddlename(string mname){
middlename=mname;
}// end of setter for middlename
string getMiddlename(){
return middlename;
}// end of getter for middlename
void setTRN(string usrTRN){
TRN=usrTRN;
}// end setter for TRN
string getUniqueId(){
return TRN;
}// end of getter for TRN
void setNIS(string usrNIS){
NIS=usrNIS;
}// end setter for NIS
string getNIS(){
return NIS;
}// end of getter for NIS
void setGender(char g){
gender = g;
}// end of gender setter
string getGender(){
return gender;
}// end of getter for gender
void setAreaOFInterest(string aoi){
AreaOfInt=aoi;
}// end of setter for AreaOfInt
string getAreaOFInt(){
return AreaOfInt;
}// end of getter for AreaOfInt
void setDOB(int d, int m, int y){
dob->setDay(d);
dob->setbMonth(m);
dob->setYear(y);
}// setter for date of birth of person
Date* getDOB(){
return dob;
}// end of getter for DOB
void addReference(Person *p, int numOfRef){
int count=0;
while(count <= numOfRef){
reference[count]->setFirstName(p->getFirstname());
reference[count]->setLastname(p->getLastname());
reference[count]->setCellNum(p->getCellNum());
reference[count]->setWrkNum(p->getWrkNum());
reference[count]->setHomeNum(p->getHomeNum());
//Address ad= p.getAddress();
reference[count]->setAddress(p->getStreetName() ,p->getStreetNum(),p->getParish());
//reference[count]->setAddress(p->getAddress());
}
}// end of loop to add reference
Person* getReference1(){
return reference[0];
}// end of getter for reference1
Person* getReference2(){
return reference[1];
}// end of getter for reference2
// method to set the registration date
void setDateOFReg(){
dateOfRegistration=time(0); // sets the date to the computer's date
}// end of method to set registration date
void setCompanyPlaced(string company){
companyPlaced=company;
}// end of setter for companyPlaced
string getCompanyPlaced(){
return companyPlaced;
}// end of accessor for comp placed
void setRecruitStatus(string status){
recruitmentStatus=status;
}// setter for recruitment status
string getRecruitStatus(){
return recruitmentStatus;
}// end of accessor for recruitment status
// method to get the registration date
time_t getDateOFReg(){
return dateOfRegistration;
/* Hubert please remember that the date is not formatted. to do so:
you must use 'ctime(&variableName)' with cout or gui
and remembe to include 'time.h' */
}// end of getter for registration date
void setDateSelected(){
lastSelectedDate=time(0); // this sets the time to the cuurrent date
}// sets last selected date to current date
time_t getSelectedDate(){
return lastSelectedDate; // remember needs formatting like registration date too
}// returns the last selected date
// set links (pointer)
void setNext(JobSeeker *n){
next=n;
}// end of setNext
JobSeeker * getNext(){
return next;
}// end of getNext
};// end class
#endif // end of Job Seeker class
人员类别:
#ifndef PERSON_H
#define PERSON_H
#include "Address.h"
#include <string>
using namespace std;
class Person{
protected:
string firstname;
string lastname;
Address *personAddress;
string wrkNum;
string cellNum;
string homeNum;
//Person *persPointer;
public:
Person(){
firstname= "default";
lastname="default";
wrkNum="";
cellNum="";
homeNum="";
personAddress->setStreet("");
personAddress->setStreetNum(0);
personAddress->setParish("blank");
}// default constructor for person
//Address *personAddress;
void setFirstName(string fname){
firstname=fname;
}// end of firstname setter
void setLastname(string lname){
lastname=lname;
}// end of lastname setter
string getFirstname(){
return firstname;
}// end of getter for firstname
string getLastname(){
return lastname;
}// end of getter for lastname
void setWrkNum(string tNum){
wrkNum=tNum;
}// end of method to set home number
string getWrkNum(){
return wrkNum;
}// end of getter for telNum
void setCellNum(string cNum){
cellNum=cNum;
}// end of setter for cellNum
string getCellNum(){
return cellNum;
}// end of getter for cellNum
void setHomeNum(string hNum){
homeNum=hNum;
}// setter for home number
string getHomeNum(){
return homeNum;
}// getter for homeNum
void setAddress(string streetName, string streetNum, string parish){
personAddress->setStreet(streetName);
personAddress->setStreetNum(streetNum);
personAddress->setParish(parish);
}// end of address setter
void setAddress(Address *ad){
personAddress->setStreet(ad->getStreet());
personAddress->setStreetNum(ad->getStreetNum());
personAddress->setParish(ad->getParish());
}
Address* getAddress(){
return personAddress;
}// get personAddress
string getStreetName(){
return personAddress->getStreet();
}// end of method to get Street name
string getStreetNum(){
return personAddress->getStreetNum();
}// end of method to get streetNum
string getParish(){
return personAddress->getParish(); ;
}// end of getter for parish
};// end of class Person
#endif // PERSON_H
日期类别:
#ifndef Date_H
#define Date_H
#include <iostream>
using namespace std;
class Date{
private:
int day, month, year;
public:
Date(){
day= 0;
month=0;
year=0;
}// end of DOB default constructor
void setDay(int d){
day=d;
}// end of setter for bDay
// setbMonth
void setbMonth(int m){
month= m;
}// end of setter for bMonth
void setYear(int y){
year=y;
}// end of setter for year
// display method
void display(){
cout << month << "/ " << day <<"/ " << year << endl;
}// end diplay method for date
}; // emd of class DOB
#endif // Date_H
地址类别:
// class used for the addresses of the employees and the job seekers
// Date created Feb 28, 2012
#ifndef ADDRESS_H
#define ADDRESS_H
#include <string>
using namespace std;
class Address{
private:
string streetName;
string streetNum;
string parish;
public:
Address(){
streetName= "unknown";
streetNum="";
parish="blank";
}// end of default constructor for Address
// destructor for address
Address::~Address(){
}// end of destructor
void setStreet(string street){
streetName=street;
}// end of setter for street name
void setStreetNum(string streetNumber){
streetNum=streetNumber;
}// end of setter streetNumber
void setParish(string par){
parish=par;
}// end of setter for parish
//getters
string getStreet(){
return streetName;
}//end of getter for street
string getStreetNum(){
return streetNum;
}// end of getter for streetNum
string getParish(){
return parish;
}// end of getter for
};// end of class Address
#endif
我可以看到Employer类中的empAddress成员是一个指针,从未初始化。在你的雇主承包商中,你试图访问它
empAddress->setStreet(" ");
empAddress->setStreetNum(" ");
empAddress->setParish(" ");
因此创建了内存冲突错误,因为empAddress必须包含垃圾。一个很好的做法是总是将指针设置为NULL,所以如果崩溃,你会看到一个NULL值,而不是一些随机值。
因此在构造器this->empAddress= new Address()
中创建empAddress
另一个好的实践(与我给你的一致):如果你未使用的指针或释放的指针设置为NULL,你可以很容易地测试它们,看看你是否可以使用或释放它们。例如,在你的雇主析构函数中,你在没有任何事先测试的情况下删除empAddress,如果你在代码的其他地方犯了错误,这可能会导致错误。在你的情况下,如果你没有在构造函数中崩溃,你就会在析构函数中崩溃。
您在默认构造函数中设置empAddress->setStreet(" ");
,但empAddress未初始化。
相关文章:
- 试图修复一个错误,该错误不会让我开始编程其余部分
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 在 C++ 中使用 "transform" 会给出一个错误,指出这未在作用域中声明
- 在Cython中使用C库时,我遇到了一个错误
- 我需要帮助创建一个评分系统,但它一直给我一个错误,注释掉的整数是给我带来麻烦的部分
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 从system()调用G++会返回一个错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 使用声明:GCC 和 Clang 的另一个错误?
- 全球免费给出一个错误.调试器不解释
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- 为什么第三板有一个错误
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 我需要在 Android Studio 中构建 NDK. 但它返回一个错误