2015-12-05 43 views
0
istream & read_person(istream & in, person * & p){ 
    char start, end, s, n, t, e = '\0'; 
    string surname, name, tele, email, pers =""; 
    if ((in >> start)&&(start =='<')) { 
    if((in >> pers >> s >> surname >> n >> name >> end) && (start == '<' &&  pers == "person" && s == 'S' && n == 'N' && end == '>')) { 
    person p_0(name,surname); 
    p = &p_0; 
} 
else if((in >> pers >> s >> surname >> n >> name >> t >> tele >> end) && (start == '<' && pers == "person" && s == 'S' && n == 'N' && t == 'T' && end == '>') 
{ 
    person_with_telephone p_t(name, surname, tele); 
    p = &p_t; 
} 
else if((in >> pers >> s >> surname >> n >> name >> e >> email >> end) && (start == '<' && pers == "person" && s == 'S' && n == 'N' && e == 'E' && end == '>')) 
{ 
    person_with_email p_e(name, surname, email); 
    p = &p_e; 
} 
else if((in >> pers >> s >> surname >> n >> name >> t >> tele >> e >> email >> end) && (start == '<' && pers == "person" && s == 'S' && t== 'T' && e == 'E' && n == 'N' && end == '>')) 
{ 
    person_with_telephone_and_email p_t_e(name, surname, tele, email); 
    p = &p_t_e; 
    } 
    else 
    { 
     in.setstate(ios::badbit); //read failed 

    } 
} 
return in; 
} 

這裏是人類,我有這是很容易理解它的名字和姓氏兩個字符串和一個打印方法超載輸入流++什麼是錯在我的解決方案

class person 
{ 
    string name; 
    string surname; 

    public: 

    person(){} 

    person(string strName, string strSurname):name(strName),surname(strSurname) { }   

    void set_name(string strName) 
    { name= strName; } 

    void set_surname(string strSurname) 
    { surname= strSurname; } 

    string get_name()const 
    { return name; } 

    string get_surname()const 
    { return surname; } 

    virtual bool has_telephone_p()const 
    { return false; } 

    virtual bool has_email_p()const 
    { return false; } 


    virtual void print(ostream& out)const 
    { 
      out << "<person S "<<get_surname()<<" N " << get_name() << ">"; 
    }  

    }; 

我我試圖超載iostream,可以閱讀爲這種格式 它讀取罰款的第一個,但沒有閱讀其餘的案件

回答

0

請不要使用指針這一點。

person p_0(name,surname); // temporary person 
p = &p_0; // assign its address to a pointer 

p_0最終超出範圍。你留下了一個無效的指針和未定義的行爲。

更改operator>>簽名本:

istream &read_person(istream &in, person &p); // no pointer here, just reference 

和內部調整代碼:

p = p_0;     // making a copy 
p = person(name, surname); // you might as well do it in one line 
p = {name, surname};  // or like this 

不要朝着將來容易出錯的人慣用的方法傾斜了。

+0

我對C++非常陌生我應該使用什麼而不是這個 – Rayyan

+0

我從參數類型中刪除了指針,在函數體中的'p'分配後刪除了&符號。 – LogicStuff

+0

同時調用來檢查這個功能,我正在使用這樣的東西\t person * pp = 0; while(read_person(cin,pp)&& pp) \t cout << * pp << endl; – Rayyan

相關問題