C++ 使用动态内存分配重载istream运算符

C++ 使用动态内存分配重载istream运算符,c++,memory-management,operator-overloading,istream,dynamic-allocation,C++,Memory Management,Operator Overloading,Istream,Dynamic Allocation,您好,我对我的istream和operator>>感到困惑。我必须重载这个操作符,才能为使用动态内存分配的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 E

您好,我对我的istream和operator>>感到困惑。我必须重载这个操作符,才能为使用动态内存分配的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();
};
在赋值操作符中,我为我使用的C字符串的长度动态分配了内存。到目前为止,我的istream功能:

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

int n;
double r;
}

我的问题是:如何在istream函数的赋值运算符中使用新的动态内存分配?

只需将
类Employee
名称
数据成员从
常量字符*
更改为
标准::字符串
,您就不再需要重写
运算符=


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

免责声明:这两种解决方案都是出于教育目的,我不建议在任何实际程序中使用它。如果你需要严格要求完成家庭作业,那也许可以:

第一:

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;
}
同样,在“使用现有赋值运算符”条件下创建的两种解决方案,实际代码应该不同

注:

是多余的,写吧

delete [] name;

相反

不幸的是,我不能只使用std::string,在这种情况下,我必须使用c string以及动态分配。因此,基本上它忽略了动态分配,只是生成一个1024的字符数组?不,它使用的是动态分配,因为有赋值运算符。如果您只需要另一个动态分配,而不是在赋值运算符中,请将问题弄清楚。无论如何,要从流中输入名称,您需要提供足够大的缓冲区。删除您在istream函数中创建的新内存分配如何?这将在对象tmp的~Employee()中删除。我想你是在那儿叫delete[]吧?为什么您认为我添加了tmp.name=0行;在第二个例子中?哦,好吧,忘了析构函数
if (name != NULL) delete [] name;
delete [] name;