1

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

Мой 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?

ответ

0

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

Первое:

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

Итак, в основном, игнорируя динамическое распределение и просто создавая массив символов 1024? – user2140629

+0

Нет, он использует динамическое распределение, поскольку есть оператор присваивания. Если вам нужно просто другое динамическое распределение, а не в вашем операторе присваивания, сделайте свой вопрос более ясным. В любом случае, чтобы ввести имя из потока, вам нужно предоставить достаточно большой буфер. – Slava

+0

Как насчет удаления нового распределения памяти, созданного в функции istream? – user2140629

2

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

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

+0

К сожалению, я не могу просто использовать зЬй :: строку, я должен использовать гр строку в этом случае, а также как использование динамического распределения. – user2140629

Смежные вопросы