1

クラスEmployeeがあります。(メンバータスクとタスクリストを追加したときから、私のコメントの一部が更新されていません。申し訳ありません。)

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

従業員.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;
}

コピー コンストラクターと割り当てのオーバーロードを実装するように指示されました。また、個々の Employee オブジェクトをメイン プログラムで動的に割り当てるように具体的に指示されました。

私が問題を抱えているように見えるのは、割り当てのオーバーロードを使用したスワッピングです。

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

問題の問題はここで発生しているようです:( *emp1 = *emp2;メインプログラムの下部に向かって)、しかし、私はその理由を理解できません; 任意の助けをいただければ幸いです。私はそれを回避することができましたが、それが演習の目的ではないと思います.なぜこのステートメントが正しく機能しないのか知りたいです.

ありがとう。

4

1 に答える 1

1

コンストラクタ内

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

渡されたポインターaをデータメンバーに格納するだけでtaskList

主に配列

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

動的に割り当てられませんでした。したがって、コピー代入演算子で、そのような配列の演算子 delete [] を呼び出すことはできません

delete[] taskList;

コンストラクターで、コンストラクターに引数として渡されるポインターの配列を動的に割り当てる必要があります。

tasksまた、デフォルトのコンストラクターでは、データ メンバーを 0に設定する必要があることに注意してください 。

于 2020-05-01T22:18:30.223 に答える