При заполнении массива объектов(работников) запоминает только последнее значение именно 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 шт):
Вы в объектах сохраняете указатель на строку 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);
}
};