2013-01-13 85 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<<是朋友函数。