1

你好,我很困惑我的istream & operator >>。我必須重載此運算符以爲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

免責聲明:這兩種解決方案都是用於教育目的,我不建議在任何真實程序中使用它。如果您需要解決的功課有嚴格的要求,那麼,也許OK:

第一:

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的char數組? – user2140629 2013-03-14 02:13:17

+0

不,它是使用您的動態分配,因爲有分配運算符。如果您只需要另一個動態分配,而不是在您的賦值運算符中,請更清楚地說明問題。無論如何,從流輸入名稱,你需要提供足夠大的緩衝區。 – Slava 2013-03-14 02:16:29

+0

如何刪除您在istream函數中創建的新內存分配? – user2140629 2013-03-14 02:18:04

2

只是class Employeename數據成員從const char*更改爲std::string,你會不會需要重寫operator=了:)

請注意,這是一個很好的做法,以避免動態分配儘可能多的。嘗試利用自動存儲時間的對象並瞭解更多關於RAII idiom的信息。你的代碼將變得更容易閱讀,並且對於內存泄漏更容易受到攻擊:)

+0

可惜我不能只使用的std :: string我必須使用C字符串在這種情況下作爲使用動態分配。 – user2140629 2013-03-14 01:59:37