你好,所以我对我的istream&运营商GT;取代。我必须重载此运算符以获取为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函数中使用赋值运算符中的新动态内存分配?
答案 0 :(得分:2)
只需将name
的{{1}}数据成员从class Employee
更改为const char*
,您就不再需要覆盖std::string
了。)
请注意,尽可能避免动态分配是一种很好的做法。尝试利用具有自动存储持续时间的对象,并了解有关RAII idiom的更多信息。您的代码将变得更易于阅读,并且不易受到内存泄漏的影响:)
答案 1 :(得分: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;
}
其次 - 更丑陋,更有效&#34;有效&#34;溶液:
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;
}
同样在条件&#34;下创建的两个解决方案都使用现有的赋值运算符&#34;,实际代码应该是不同的。
注意:
if (name != NULL) delete [] name;
是多余的,写
delete [] name;
代替