При заполнении массива объектов(работников) запоминает только последнее значение именно FIO. C++.ООП

ТЗ: Разработать связи между следующими классами: класс «Служащий» (содержащий ФИО служащего), класс «Работники с почасовой оплатой» (оплата за час, часы, отработанные за неделю), класс «Работники со сдельной оплатой» (оплата за единицу продукции, число единиц продукции, произведенной за неделю). Все классы должны содержать функции получения и изменения всех полей. Написать программу, позволяющую получать сведения о служащих. Использовать конструктор с параметрами, конструктор без параметров, конструктор копирования. В класс добавить необходимый набор полей и методов (минимум два поля и два метода) на свое усмотрение. Предусмотреть метод для записи полученных данных в файл.

Проблема в том, что когда я заполняю массив, в FIO нулевого элемента все равно идет последнее значение. Не понимаю с чем это связано

#include <iostream>
#include <memory>
#include<locale.h>
#include <fstream>
using namespace std;


class Employee
{
protected:
    char* FIO;
    
public:
    virtual void SetFIO(char* f) = 0;
    virtual char* GetFIO() = 0;
    virtual void printInf() = 0;
    virtual void printFile() = 0;
};

class Employee_hour : public Employee
{
private:
    int payment_hour;
    int hours_week;

public:
    Employee_hour() {
        FIO = NULL;
    }
    Employee_hour(char* f) {
        FIO = f;
    }
    ~Employee_hour() {
        delete[] FIO;
    }
    Employee_hour(const Employee_hour& Em) {
        FIO = Em.FIO;
    }
    char* GetFIO() override {
        return FIO;
    }
    void SetFIO(char* f) override {
        FIO = f;
    }
    int Getpayment_hour(){
        return payment_hour;
    }
    void Setpayment_hour(int value) {
        payment_hour = value;
    }
    int Gethours_week() {
        return hours_week;
    }
    void Sethours_week(int value) {
        hours_week = value;
    }
    void printInf() override {
        cout << GetFIO() << " : " << Getpayment_hour() << "$/hour; " << Gethours_week() << " hours/week "<<endl;
    
    }
    void printFile() override {
        ofstream file;
        file.open("file.txt");
        if (!file.is_open()) {
            cout << "Error!";
        }
        else {
            file << "FIO = " << GetFIO() << endl;
            file << Gethours_week() << " hours/week " << endl;
            file << Getpayment_hour()<< "$/hour" << endl;
        }
        file.close();
    }

};



class Employee_ed : public Employee
{
private:
    int payment_ed;
    int ed_week;

public:
    Employee_ed() {
        FIO = NULL;
    }
    Employee_ed(char* f) {
        FIO = f;
    }
    ~Employee_ed() {
        delete[] FIO;
    }
    Employee_ed(const Employee_ed& Em) {
        FIO = Em.FIO;
    }
    char* GetFIO() override {
        return FIO;
    }
    void SetFIO(char* f) override {
        FIO = f;
    }
    int Getpayment_ed() {
        return payment_ed;
    }
    void Setpayment_ed(int value) {
        payment_ed = value;
    }
    int Geted_week() {
        return ed_week;
    }
    void Seted_week(int value) {
        ed_week = value;
    }
    void printInf() override {
        cout << GetFIO() << " : " << Getpayment_ed() << "$/ed; " << Geted_week() << " ed/week " << endl;

    }
    void printFile() override {
        ofstream file;
        file.open("file2.txt");
        if (!file.is_open()) {
            cout << "Error!";
        }
        else {
            file << "FIO = " << GetFIO() << endl;
            file << Geted_week() << " ed/week " << endl;
            file << Getpayment_ed() << "$/ed" << endl;
        }
        file.close();
    }
};


int main()
{
    setlocale(LC_ALL, "Russian");
    Employee_hour* mas1 = new Employee_hour[2];
    Employee_ed* mas2 = new Employee_ed[2];
    char m[15] = "";
    int a, b;
    cout << "Работники с почасовой оплатой" << endl;
    for (int i = 0; i < 2; i++) {
        cout << "Введите фио: " << endl;
        cin >> m;
        mas1[i].SetFIO(m);
        //cout << mas1[0].GetFIO() << endl;
        cout << "Введите оплату за час : " << endl;
        cin >> a;
        mas1[i].Setpayment_hour(a);
        cout << "Введите кол-во часов в неделю : " << endl;
        cin >> b;
        mas1[i].Sethours_week(b);
    }
    //cout << mas1[0].GetFIO() << endl;
    
    int v;
    cout << "Вывести информацию о работниках с почасовой оплатой и записать в файл? 1-да 2-нет" << endl;
    cin >> v;
    if (v == 1) {
        for (int i = 0; i < 2; i++) {
            mas1[i].printInf();
            mas1[i].printFile();
        }
       

    }else { cout << "Продолжаем..." << endl;}
    cout << "Работники со сдельной оплатой" << endl;
    
    for (int i = 0; i < 2; i++) {
        cout << "Введите фио: " << endl;
        cin >> m;
        mas2[i].SetFIO(m);
        cout << "Введите оплату за единицу продукции: " << endl;
        cin >> a;
        mas2[i].Setpayment_ed(a);
        cout << "Введите число единиц продукции в неделю : " << endl;
        cin >> b;
        mas2[i].Seted_week(b);
    }
    cout << "Вывести информацию о работниках со сдельной оплатой и записать в файл? 1-да 2-нет" << endl;
    cin >> v;
    if (v == 1) {
        for (int i = 0; i < 2; i++) {
            mas2[i].printInf();
            mas2[i].printFile();
        }

    }
    else { cout << "Пока..." << endl; }
    
}



Ответы (2 шт):

Автор решения: Igor

Как Вы думаете, что здесь происходит? -

FIO = f;

А здесь? -

delete[] FIO;

strdup

→ Ссылка
Автор решения: Иван Подк

Вы в объектах сохраняете указатель на строку m в main(), а не само значение. Значение переменной, на которую указывает m, затем меняется при вводе следующего ФИО, а объекты массивов mas1 и mas2 (хранящие тот же указатель m) просто указывают на это изменившееся значение.

Вам необходимо хранить в классах значение, а не указатель. Для этого проще всего воспользоваться std::string, но можно и использовать простые указатели. Для этого можно использовать функцию strdup предложенную в другом ответе:

#include <string.h>

class Employee
{
protected:
    const char* FIO;
    
public:
    virtual void SetFIO(char* f) = 0;
    virtual const char* GetFIO() = 0;
};

class Employee_hour : public Employee
{
public:
    ~Employee_hour() {
        free FIO;
    }
    const char* GetFIO() override {
        return FIO;
    }
    void SetFIO(char* f) override {
        FIO = strdup(f);
    }
};



class Employee_ed : public Employee
{
public:
    ~Employee_ed() {
        free FIO;
    }
    const char* GetFIO() override {
        return FIO;
    }
    void SetFIO(char* f) override {
        FIO = strdup(f);
    }
};
→ Ссылка