简体   繁体   中英

overloaded assignment operator not working

I have a class Employee . (Some of my comments are not updated from when I added members tasks and taskList; I apologize for that.)

Employee.h

#include <string>
#include <iostream>
using namespace std;
class Employee {
private:
    string employee_name;
    string employee_ssn;
    string * taskList;  //stores an array of tasks for the employee to do
    int tasks;  //stores the number of tasks an employee needs to do
public:
    //constructors  
    Employee(); //default - nothing
    Employee(string, string, string a[], int numOfTasks);   //sets both ssn and name
    ~Employee(); //destructor
    //copy constructor:
    Employee(const Employee &emp);
    Employee & operator =(const Employee& source);
    void set_name(string);      //sets name in program
    void set_ssn(string);       //sets ssn in program
    string get_ssn();           //returns ssn as string
    string get_name();          //returns emp name as string
    void display();             //displays both on two separate lines
};

Employee.cpp

#include "Employee.h"
//constructors  
//default constructor makes the object empty
Employee::Employee() {
    taskList = nullptr;
    return;
}
//constructor sets both name and ssn
Employee::Employee(string x, string y, string a[], int numOfTasks) {
    employee_name = x;
    employee_ssn = y;
    tasks = numOfTasks;
    taskList = a;
    return;
}
//destructor
Employee::~Employee() {
    delete [] taskList;
}
//copy constructor
Employee::Employee(const Employee & source) {
    //copy simple member variables
    employee_name = source.employee_name;
    employee_ssn = source.employee_ssn;
    tasks = source.tasks;
    //allocate new dynamic array for taskList
    taskList = new string[source.tasks];
    //copy values from one taskList to another
    for (int i = 0; i < tasks; i++)
        taskList[i] = source.taskList[i];
    return;
}
//assignment operator overloading
Employee & Employee::operator =(const Employee& source) {
    cout << "Calling the assignment operator overloader.\n";
    //check for self assignment
    if (this == &source)
        return *this;   //avoid doing extra work

    employee_name = source.employee_name;
    employee_ssn = source.employee_ssn;
    tasks = source.tasks;

    cout << "Substituting 'task list'\n";
    //delete former taskList
    //if (taskList != nullptr)
        delete[] taskList;
    cout << "TaskList deleted.\n";
    //allocate new one with same capacity
    taskList = new string[source.tasks];
    //copy values from one to the oher
    for (int i = 0; i < tasks; i++)
        taskList[i] = source.taskList[i];
    cout << "Function complete.\n";
    return *this;
}

//postcon: name is set to inputted string
void Employee::set_name(string s) {
    employee_name = s;
    return;
}
//postcon: ssn is set to inputted string
void Employee::set_ssn(string s) {
    employee_ssn = s;
    return;
}
//returns ssn as string
string Employee::get_ssn() {
    return employee_ssn;
}
//returns employee name as string
string Employee::get_name() {
    return employee_name;
}
//precon: name and ssn are both assigned
//postcon: name and ssn printed to the screen w/ labels on two lines
void Employee::display() {
    cout << "Name: " << employee_name << endl;
    cout << "SSN: " << employee_ssn << endl;
    cout << "Tasks:\n";
    for (int i = 0; i < tasks; i++)
        cout << i + 1 << ". " << taskList[i] << endl;
    return;
}

We were instructed to implement a copy constructor and assignment overloading, and we were also specifically instructed to make individual Employee objects dynamically allocated in the main program.

What I seem to be having issue with is the swapping using the assignment overload.

employee_driver.cpp

#include "Employee.h"
#include <iostream>

int main() {
    //tasks for each employee to do:
    //Tasks to be assigned to Marcy:
    string tasks[2] = {"Send emails", "Prepare meeting brief"};
    //Taks to be assigned to Michael:
    string tasks2[3] = {"Stock up on pens", "Send emails", "Organize union"};

    Employee *emp1 = new Employee("Marcy", "678091234", tasks, 2);
    Employee *emp2 = new Employee("Michael", "123994567", tasks2, 3);

    //display data before swap
    emp1->display();
    cout << endl;
    emp2->display();
    cout << endl;

    //swap employees
    Employee temp(*emp1);   //using copy constructor to copy first employee into temporary
    *emp1 = *emp2;
    *emp2 = temp;   //uses overloaded assignment operator to copy values of temp into emp2; Marcy's data is now in Michael's pointer

    //display after swap
    cout << "\n\nAfter swap:\n\n";
    emp1->display();
    cout << endl;
    emp2->display();



    //free heap
    delete emp1;
    delete emp2;
    //delete emp3;

    return 0;
}

The issue in question seems to occur here: *emp1 = *emp2; (towards the bottom of the main program), but I cannot figure out why; any help would be appreciated. I could get around it, but I don't think that's the purpose of the exercise, and I would like to know why this statement is not working correctly.

Thanks.

Within the constructor

Employee::Employee(string x, string y, string a[], int numOfTasks) {
    employee_name = x;
    employee_ssn = y;
    tasks = numOfTasks;
    taskList = a;
    return;
}

you just store the passed pointer a in the data member taskList ,

In main the arrays

string tasks[2] = {"Send emails", "Prepare meeting brief"};
//Taks to be assigned to Michael:
string tasks2[3] = {"Stock up on pens", "Send emails", "Organize union"};

were not allocated dynamically. So you may not in the copy assignment operator call the operator delete [] for such arrays

delete[] taskList;

You need in the constructor to allocate dynamically the array a pointer to which is passed as an argument to the constructor.

Also pay attention to that in the default constructor you need to set the data member tasks to 0.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM