简体   繁体   English

重载赋值运算符不起作用

[英]overloaded assignment operator not working

I have a class Employee .我有一个 class员工 (Some of my comments are not updated from when I added members tasks and taskList; I apologize for that.) (当我添加成员任务和任务列表时,我的一些评论没有更新;对此我深表歉意。)

Employee.h员工.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雇员.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.我们被指示实现复制构造函数和赋值重载,并且还特别指示我们在主程序中动态分配单个 Employee 对象。

What I seem to be having issue with is the swapping using the assignment overload.我似乎遇到的问题是使用赋值重载进行交换。

employee_driver.cpp员工驱动程序.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;有问题的问题似乎发生在这里: *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 ,您只需将传递的指针a存储在数据成员taskList中,

In main the arrays主要是 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 [] 为这样的 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.另请注意,在默认构造函数中,您需要将数据成员tasks设置为 0。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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