Перегрузка оператора 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?


person user2140629    schedule 14.03.2013    source источник


Ответы (2)


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

Первый:

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;

вместо

person Slava    schedule 14.03.2013
comment
Так что в основном это игнорирует динамическое распределение и просто создает массив символов из 1024? - person user2140629; 14.03.2013
comment
Нет, он использует ваше динамическое распределение, так как есть оператор присваивания. Если вам нужно просто еще одно динамическое распределение, а не в вашем операторе присваивания, сделайте свой вопрос более ясным. В любом случае, чтобы ввести имя из потока, вам нужно предоставить достаточно большой буфер. - person Slava; 14.03.2013
comment
Как насчет удаления нового выделения памяти, созданного в функции istream? - person user2140629; 14.03.2013
comment
Это будет удалено в ~Employee() для объекта tmp. Я полагаю, вы вызываете здесь delete[]? Как вы думаете, почему я добавил строку tmp.name = 0; во втором примере? - person Slava; 14.03.2013
comment
О, ладно, забыл про деструктор - person user2140629; 14.03.2013
comment
Худшее, что вы можете сделать при работе с динамическим размещением — забыть о деструкторах :) - person Slava; 14.03.2013

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

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

person LihO    schedule 14.03.2013
comment
К сожалению, я не могу просто использовать std::string. В этом случае я должен использовать строку c, а также использовать динамическое распределение. - person user2140629; 14.03.2013