Перегрузка оператора istream с динамическим распределением памяти

Привет, поэтому я запутался с моим istream& оператор >>. Я должен перегрузить этот оператор, чтобы получить ввод для класса, который использует динамическое выделение памяти для строки C.

Мой файл Employee.h

#include <iostream>
using namespace std;

const double MIN_WAGE = 10.25;

class Employee {

int num;
char * name;
double rate;

public:

Employee();
Employee(const Employee&);
Employee operator=(const Employee&);
friend istream& operator>>(istream& is, Employee& employee);
friend ostream& operator<<(ostream& is, const Employee& employee);
friend bool operator>(const Employee& a, const Employee& b);
~Employee();
};

У меня есть конструктор копирования, который вызвал оператор присваивания

Employee::Employee(const Employee & e) {

name = NULL;

*this = e;
}

Employee Employee::operator=(const Employee & e) {

if (this != e) {

num = e.num;
rate = e.rate;

if (name != NULL) delete [] name;

if (e.name != NULL) {
name = new char[strlen(e.name) + 1];
strcpy(name, e.name);
}

else name = NULL;
}

return *this;

}

И в операторе присваивания у меня есть динамически назначаемая память для длины строки C, которую я использую. Моя функция istream до сих пор:

istream& operator>>(istream& is, Employee & e) {

int n;
double r;
}

Мой вопрос: как мне использовать новое динамическое распределение памяти в моем операторе присваивания в моей функции istream?

1

Решение

Отказ от ответственности: оба решения предназначены для образовательных целей, и я не рекомендовал бы использовать его в любой реальной программе. Если вам нужно выполнить домашнее задание со строгими требованиями, тогда это может быть хорошо:

Первый:

istream& operator>>(istream& is, Employee & e) {
Employee tmp;
tmp.name = new char[1024];
is >> tmp.num >> tmp.rate >> tmp.name;
e = tmp;
return is;
}

Второе — более некрасивое и более «эффективное» решение:

istream& operator>>(istream& is, Employee & e) {
char buffer[1024];
Employee tmp;
tmp.name = buffer;
is >> tmp.num >> tmp.rate >> tmp.name;
e = tmp;
tmp.name = 0;
return is;
}

Снова оба решения созданы при условии «использовать существующий оператор присваивания», реальный код должен быть другим.

Замечания:

if (name != NULL) delete [] name;

избыточно, пиши

delete [] name;

вместо

0

Другие решения

Просто измените name элемент данных class Employee от const char* в std::string и вам не нужно переопределять operator= больше 🙂

Обратите внимание, что рекомендуется избегать динамического размещения в максимально возможной степени. Попробуйте воспользоваться объектами с автоматическим хранением и узнать больше о RAII идиома. Ваш код станет легче для чтения и менее уязвим для утечек памяти 🙂

2

По вопросам рекламы [email protected]