2

你好,所以我对我的 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 函数的赋值运算符中使用新的动态内存分配?

4

2 回答 2

2

只需将from的name数据成员更改为,您将不再需要覆盖:)class Employeeconst char*std::stringoperator=

请注意,尽可能避免动态分配是一种很好的做法。尝试利用具有自动存储持续时间的对象并了解有关RAII 惯用语的更多信息。您的代码将变得更易于阅读并且更不容易受到内存泄漏的影响:)

于 2013-03-14T01:50:31.463 回答
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;

反而

于 2013-03-14T02:09:20.713 回答