2013-01-13 68 views
1
class user 
{ 
private: 
    std::string first_name; 
    std::string middle_name; 
    std::string last_name; 
    int ID; 
    static int next_id; 

public: 

     static int next_user_id() 
     { 
     next_id++; 
     return next_id; 
     } 
     group User_Group; 
     void set_ID(int c) 
     { 
     ID=c; 
     } 
     int get_ID() 
     { 
     return ID; 
     } 
     void set_first_name(std::string c) 
     { 
      first_name=c; 
     } 
     string get_first_name() 
     { 
     return first_name; 
     } 
     void set_middle_name(std::string c) 
     { 
      middle_name=c; 
     } 
     string get_middle_name() 
     { 
      return middle_name; 
     } 
     void set_last_name(std::string c) 
     { 
      last_name=c; 
     } 
     string get_last_name() 
     { 
      return last_name; 
     } 
     user() 
     { 
      ID = user::next_id++; 
     } 
friend istream operator>>(istream is, user User); 
friend ostream operator<<(ostream os, user User); 
}; 
int user::next_id; 
istream operator>>(istream is, user User) 
{ 
    is >> User.get_first_name(); 
    is >> User.get_middle_name(); 
    is >> User.get_last_name(); 
    is >> User.get_ID(); 
    is >> User.User_Group.get_name(); 
    for(int j=0;j<=4;j++) 
    { 
     is >> User.User_Group.Week_Food[j].get_breakfsat(); 
     is >> User.User_Group.Week_Food[j].get_lunch(); 
     is >> User.User_Group.Week_Food[j].get_dinner(); 
    } 
    for (int j=0;j<=30;j++) 
    { 
     is >> User.User_Group.Month_Food[j].get_breakfsat(); 
     is >> User.User_Group.Month_Food[j].get_lunch(); 
     is >> User.User_Group.Month_Food[j].get_dinner(); 
    } 
} 


ostream operator<<(ostream os, user User) 
{ 
    os<<User.get_first_name()<<" "<< User.get_middle_name() <<" "<<User.get_last_name()<<" "; 
     for(int j=0;j<=4;j++) 
     { 
     os<<User.User_Group.Week_Food[j].get_breakfsat()<<" "<<User.User_Group.Week_Food[j].get_lunch()<<" "<< User.User_Group.Week_Food[j].get_dinner()<<" "; 
     } 
     for (int j=0;j<=30;j++) 
     { 
     os<< User.User_Group.Month_Food[j].get_breakfsat()<<" "<<User.User_Group.Month_Food[j].get_lunch()<<" "<<User.User_Group.Month_Food[j].get_dinner(); 
     } 
} 

我是新來的C++,也許這是一個愚蠢的問題,但我需要的對象的數組寫入文件,並讀取它通過重載< <和>>運算形成有。當我嘗試將它用於int和bool類的成員時,出現錯誤。它似乎工作良好的字符串類型,所以我不知道如何繼續。我不斷收到一個錯誤:「沒有操作符>>與int和bool變量上的thees操作數匹配」。在>>運算符重載

+1

'get_breakfsat'在您的代碼中始終拼寫錯誤... –

回答

4

其中的一個問題是在這裏:

is >> User.get_ID(); 

get_ID()按值返回int。以「流」的值到ID變量,您將需要一個(非const)引用返回到它:

class user { 
    .... 
    int& get_ID() { return ID; } // non-const version (e.g. for istream) 
    const int& get_ID() { return ID; } // const version 
    ... 
}; 

此外,還需要運營商採用並返回引用流:

friend istream& operator>>(istream& is, user User); 
friend ostream& operator<<(ostream& os, user User); 

您可能還需要避免傳遞引用複製User對象:

friend istream& operator>>(istream& is, user& User); // modifies user so no const 
friend ostream& operator<<(ostream& os, const user& User); // should not modify user 

這就要求你讓你的gette r方法const,無論如何你應該這樣做。

+0

對不起,但這並沒有幫助我,我也沒有明白它 – user1523627

+0

@ user1523627您嘗試了什麼以及出現什麼錯誤? – juanchopanza

+0

我試過你的解決方案,第一個沒有改變錯誤。第二個在重載函數中的User對象上添加新錯誤,錯誤是:「對象具有與成員函數不兼容的類型限定符」。 – user1523627

0

在你閱讀器的功能,你有這樣的臺詞:

is >> User.get_first_name(); 
is >> User.get_middle_name(); 
is >> User.get_last_name(); 
is >> User.get_ID(); 

這些函數返回左值或可從不是東西,可以是寫入讀取值。您可以添加這些功能重載這樣的:

int & get_ID() // Note return of reference to member variable! 
{ 
return ID; 
} 

但後來你會(因爲它們查詢對象,你無論如何都應該做的 - 而不是改變它)使你現在有常量的干將:

int get_ID() const // <- note const - meaning this fn doesn't change user. 
{ 
return ID; 
} 

這是因爲重載不能僅通過返回類型加以區分。使得getters const使隱含的參數const &。

說了這麼多,我會不是添加返回引用的重載。這是不好的做法,因爲它會以潛在的破壞性方式公開您的成員變量。 我建議從istream讀入局部變量,然後使用你的setter。這就是他們在那裏。

int myID; 
is >> myID; 
set_ID(myID); 

這將打開的可能性:

  1. 你制定者可以做你的投入其中是通過直接讀取到您的類對象短路檢查。

  2. 您可以添加一個檢查,從輸入流中讀取後沒有錯誤。

這給你靈活性。我發現最好是保護自己免受格式錯誤的文件和數據庫的攻擊。

0

代碼編譯失敗的原因是您正在讀入臨時文件,編譯器不允許您這樣做。重點在於對get_ID()的調用返回用戶結構中值的副本(!)。如果您隨後在該副本中存儲了一些值,則無論如何都會保留原始的未修改值。請記住,默認情況下,傳遞給函數和從函數返回的所有參數都將被複制。

要解決這個問題,而不是使用is >> User.get_ID()使用is >> User.ID。我會爲輸出做同樣的事情,但這不重要。您可以訪問這些私有變量,因爲operator>>operator<<是朋友函數。